ifelse的多个条件

时间:2015-10-20 22:51:29

标签: r if-statement

我正在尝试使用以下代码创建一个变量(df $ check6),如果以下任何一个为真,则该变量为1:

df$check  <- ifelse(df$var1 == 1 & df$var2 == 1, 1,0)
df$check2 <- ifelse(df$var3 == 1 & df$var4 == 1, 1,0) 
df$check3 <- ifelse(df$var5 == 1 & df$var6 == 1, 1, 0) 
df$check4 <- ifelse(df$var7 >=4 & df$var8 == 1, 1,0) 
df$check5 <- ifelse(df$var9 >=4 & df$var10 == 1, 1,0)

df$check6 <- ifelse(df$check== 1 | df$check2 == 1 | df$check3 == 1 | df$check4 == 1, df$check5 == 1, 1,0)

当我运行代码时,我的df $ var7和df $ var9在最初为“。”时全部更改为1。在我的数据集中。我的&gt; = 4条件似乎也没有起作用。当这两个变量的数值为“2”时,我的df $ check6 = 1,条件是它们应该等于或大于4.

我知道必须有一种更简单的方法来做到这一点,但我只是尝试使用基础知识。任何建议,将不胜感激!

编辑: var 1,3,5存储为1,0或“。” 我创建了一个仅包含== 1(不包括0和“。”情况)

的值的子集

按照建议将变量1-6,8,10转换为逻辑 7,9是数字

提供的答案然后在我的数据集上完美运行。

1 个答案:

答案 0 :(得分:2)

我在data.table中找到了更容易理解的语法(除data.table提供的其他优点外)。如果将您与1进行比较的变量存储为逻辑(看起来应该是这样),也会更容易:

library(data.table)
#convert df to a 'data.table' by reference
setDT(df)

df[ , check6 := (var1 & var2) | (var3 & var4) |
      (var5 & var6) | (var7 >= 4 & var8) | (var9 >=4 & var10)]

如果var s 1,2,3,4,5,6,8,10尚未存储为逻辑,并且它们取0,1以外的值,则可以快速将它们全部转换为逻辑:

lgkls <- paste0("var", c(1:6, 8 , 10))
df[ , (lgkls) := lapply(.SD, function(x) x == 1), .SDcols = lgkls]

如果你真的需要中间检查变量,你可以这样做:

df[ , check1 := var1 & var2]
df[ , check2 := var3 & var4]
df[ , check3 := var5 & var6]
df[ , check4 := var7 >= 4 & var8]
df[ , check5 := var9 >= 4 & var10]
df[ , check6 := check1 | check2 | check3 | check4 | check5]

当然如果你确实需要将check6存储为integer(可疑),你可以添加“骗子”的转换器:

df[ , check6 := +(check1 | check2 | check3 | check4 | check5)]

有关data.table&amp;的更多信息,请参阅here here为什么尽可能避免ifelse这是一种好习惯。