我正在寻找一种方法来创建一个新的变量(1,0),其中多个条件与AND和OR结合使用。
即。如果
a> 3和b> 5
OR
c> 3和d> 5
OR
e> 3和f> 5
1
如果不是
0
我已尝试将其编码为;
df$newvar <- ifelse(df$a > 3 & df$b > 5 | df$c > 3 & df$d > 5 | df$e > 3 & df$f > 5,"1","0")
但是在我的输出中,许多变量被编码为NA,并且数字似乎没有加起来。
有没有人对正确编码方法有什么建议?
答案 0 :(得分:0)
我们可以对列进行子集以评估大于3的值,获得list
个逻辑vector
s(&#39; l1&#39;),类似于大于5的值(& #39; l2&#39;),然后使用list
和Map
将Reduce
的相应元素与单个vector
进行比较。使用as.integer
,我们将逻辑向量强制转换为二进制
l1 <- lapply(df[c('a', 'c', 'e')] , function(x) x > 3 & !is.na(x))
l2 <- lapply(df[c('b', 'd', 'f')], function(x) x > 5 & !is.na(x))
df$newvar <- as.integer(Reduce(`|`, Map(`&`, l1, l2)))
df$newvar
#[1] 0 0 1 1 0 1 0 0 1 0
或使用OP的方法
with(df, as.integer((a >3 & !is.na(a) & b > 5 & !is.na(b)) | (c > 3 & !is.na(c) &
d > 5 & !is.na(d)) | (e > 3 & !is.na(e) & f > 5 & !is.na(f))))
#[1] 0 0 1 1 0 1 0 0 1 0
set.seed(24)
df <- as.data.frame(matrix(sample(c(NA, 1:8), 6 * 10, replace = TRUE),
ncol = 6, dimnames = list(NULL, letters[1:6])))