如何更优雅地使用data.table满足多个条件?

3

这里有一个包含2个字符变量的玩具示例。我有另一个含有两个字符的向量。逐一比较,我可以得到结果,但是否有更为优雅的方法呢?

set.seed(100)
DT <- data.table(V1 = LETTERS[sample(1:5, 10, replace = T)], 
                 V2 = LETTERS[sample(3:7, 10, replace = T)])
V1V2 = c("B", "G")
DT[V1 %in% V1V2[1] & V2 %in% V1V2[2]]
#    V1 V2
# 1:  B  G

由于我们可以使用applyDT[apply(DT[,.(V1, V2)], 1, print)]直接获取行元素,因此在i中应该有一种描述多条件表达式的方法。

我期望像这样:

DT[.(V1, V2) %in% V1V2]

但似乎这并没有起作用。

感谢建议。

2个回答

4
另一个选择是使用的连接功能:
setkey(DT, V1, V2)
DT[as.list(V1V2)]

或者:

DT[as.list(V1V2), on = .(V1, V2)]

我正在考虑合并的方式。一旦我完成实验,我会稍后反馈。谢谢! - Grec001
setDT 多余了 :) - MichaelChirico
1
@MichaelChirico 谢谢并已更新。我认为这是必要的,因为使用 .(V1V2) 无法正常工作。 - Jaap
2
是的... as.list 是必要的,将 c('B','G') 转换为 list('B','G'),而不是 list(c('B','G'))。 - MichaelChirico

2
我们可以使用as.list来逐列比较V1V2中的每个元素。
DT  == as.list(V1V2)

#       V1    V2
# [1,]  TRUE FALSE
# [2,]  TRUE  TRUE
# [3,] FALSE FALSE
# [4,] FALSE FALSE
# [5,] FALSE FALSE
# [6,] FALSE FALSE
# [7,] FALSE FALSE
# [8,]  TRUE FALSE
# [9,] FALSE FALSE
#[10,] FALSE FALSE

这个比较了V1V2 [1]DT的第一列,以及V1V2 [2]和第二列。

现在选择所有元素都为TRUE的行。

DT[rowSums(DT  == as.list(V1V2)) == ncol(DT), ]
#   V1 V2
#1:  B  G

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