如果其他条件与AND和OR结合使用多个条件

时间:2017-06-04 15:45:53

标签: r

我正在寻找一种方法来创建一个新的变量(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,并且数字似乎没有加起来。

有没有人对正确编码方法有什么建议?

1 个答案:

答案 0 :(得分:0)

我们可以对列进行子集以评估大于3的值,获得list个逻辑vector s(&#39; l1&#39;),类似于大于5的值(& #39; l2&#39;),然后使用listMapReduce的相应元素与单个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])))