我正在尝试使用以下代码创建一个变量(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是数字
提供的答案然后在我的数据集上完美运行。
答案 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)]