在data.table R中使用ifelse创建多个条件的新变量

8
我有一个 `data.table`,想要根据多个条件在 `ifelse` 语句中创建一个新的变量,但是我得到的结果似乎很奇怪。
让我们来想象一下以下简化的例子。
DT <- data.table(replicate(2,sample(0:1,5,replace=TRUE)))

   V1 V2
1:  1  0
2:  1  1
3:  1  1
4:  1  0
5:  0  1

我想基于已有的变量创建一个新变量。我使用ifelse语句如下:

DT[, new.var := ifelse(V1 > 0, 1, 0)]
DT[, new.var.mult := ifelse(V1 > 0 && V2 > 0, 1, 0)]

然而,在多个条件的情况下,这种方法并不适用。(我知道在没有多个条件的情况下可以很容易地解决此任务,但我的问题更加复杂。)

   V1 V2 new_var new_var_multiple
1:  1  0       1                0
2:  1  1       1                0
3:  1  1       1                0
4:  1  0       1                0
5:  0  1       0                0

这里可能存在什么问题呢?

3
这里不需要用ifelse,只需使用DT[, new_var_multiple := (V1 > 0 & V2 > 0) + 0]。这个代码行可以为数据表添加一个名为new_var_multiple的新列,其中包含一个逻辑值(V1 > 0 & V2 > 0)的结果(如果为真,则为1,否则为0)。 - David Arenburg
1个回答

5
你必须只使用一个&符号(&)来比较向量。
DT[, new.var.mult := ifelse(V1 > 0 & V2 > 0, 1, 0)]

说明:

> c(TRUE, TRUE) & c(FALSE, TRUE)
[1] FALSE  TRUE
> c(TRUE, TRUE) && c(FALSE, TRUE)
[1] FALSE

7
避免在data.table中使用ifelse。我认为它还没有被优化(尚未?)。如果David的评论不适用,我会做类似于DT[, x := "a"]; DT[condition, x := "b"]的操作。 - Roland
@Roland 那还是这样吗? - posdef
1
@posdef 我相信这一点,如果我没有漏掉什么的话。我怀疑优化ifelse并不是Matt和Arun的首要任务。大多数高级R程序员似乎都会避免使用ifelse - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接