复杂的多个if语句

时间:2016-02-11 19:47:40

标签: r if-statement

让我有这样一个数据框(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陈述在我看来对这些条件如此复杂。

2 个答案:

答案 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