R ifelse的多个条件

R ifelse的多个条件,r,if-statement,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 <-

我正在尝试使用以下代码创建一个变量(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$check我发现在
data.table
(除了
data.table
提供的其他优点之外)中,这个语法更容易理解。如果将要与1进行比较的变量存储为逻辑变量(看起来它们应该是逻辑变量),则也会更容易:

如果
var
s1,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]
当然,如果您确实需要将
check 6
存储为
整数
(可疑),您可以添加“骗子”的转换器:

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

有关
数据的更多信息,请参见表
&了解尽可能避免
ifelse
的最佳做法。

您能否提供一个数据框
df
,说明所提供代码不适用于您的原因?你可以阅读更多关于如何提供一个可复制的例子,如果某物是==”,那么它可能是一个因素。因子对顺序测试不起作用。但var1-6、8和10是否仅为1或0?因为他们似乎在寻找完全等于1的值,而不是非零值。@bramtayl我感觉它们可能存储为1,0,但当然很容易将它们转换为
逻辑
s;看见edit@bramtayl变量2,4,6,10仅为1或0。变量1,3,5可以是1,0或“.”如果点来自读取csv,您可能需要添加一个额外的参数:
read.csv(na.strings=“.”
这将以数字形式读取变量,将useful@MichaelChirico我使用as.logical()将变量1-6、8、10转换为逻辑变量,7、9是数字变量。当var3&var4为=1时,或当var4=1且var3=“.”时,或当var4=1且var3=0时,运行上述代码^2时,我会得到check2的“NA”。这可能是因为我的变量1,3,5可以存储为“1,0”或“.”?
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]
df[ , check6 := +(check1 | check2 | check3 | check4 | check5)]