让我有这样一个数据框(df
)
ID x1 x2 y
1 1 0 0.21
2 1 0 0.56
3 1 1 0.34
4 0 1 0.76
5 1 1 0.06
6 1 0 0.45
7 0 1 0.56
8 0 1 0.83
9 0 1 0.64
10 0 0 0.44
11 1 0 0.54
我想在colunm(z)
中创建符合以下条件的新df
:
{if(x1=1 and x2=0 and y<0.5)
then z=x2(namely 0)}
{if(x1=0 and x2=1 and y>0.5)
then z=x2(namely 1)}
else z=x1
即z
必须如下所示输出:
ID z
1 0
2 1
3 1
4 1
5 1
6 0
7 1
8 1
9 1
10 0
11 1
如何使用R执行此操作? ifelse
陈述在我看来对这些条件如此复杂。
答案 0 :(得分:3)
使用嵌套ifelse
。考虑df
是您的数据框,然后:
> df$z <- with(df, ifelse(x1==1 & x2==0 & y<0.5, x2,
ifelse(x1==0 & x2==1 & y>0.5, x2,x1 )))
>
> df
ID x1 x2 y z
1 1 1 0 0.21 0
2 2 1 0 0.56 1
3 3 1 1 0.34 1
4 4 0 1 0.76 1
5 5 1 1 0.06 1
6 6 1 0 0.45 0
7 7 0 1 0.56 1
8 8 0 1 0.83 1
9 9 0 1 0.64 1
10 10 0 0 0.44 0
11 11 1 0 0.54 1
答案 1 :(得分:3)
我将您的条件拖到我的工作区并轻轻编辑它们以通过将=
替换为==
进行布尔计算; and
与&
;和otherwise
否定这两个条件,。当FALSE时条件为0,当为TRUE时条件为1,因此充当选择器。也可以使用嵌套的ifelse
函数,但我经常发现它们很乱。在这种情况下,Jilber证明我被误导(但没错。):
dat$z <- with(dat, (x1==1 & x2==0 & y<0.5)*x2+
(x1==0 & x2==1 & y>0.5)*x2+
(!(x1==1 & x2==0 & y<0.5) & !(x1==0 & x2==1 & y>0.5))*x1)
> dat
ID x1 x2 y z
1 1 1 0 0.21 0
2 2 1 0 0.56 1
3 3 1 1 0.34 1
4 4 0 1 0.76 1
5 5 1 1 0.06 1
6 6 1 0 0.45 0
7 7 0 1 0.56 1
8 8 0 1 0.83 1
9 9 0 1 0.64 1
10 10 0 0 0.44 0
11 11 1 0 0.54 1