使用 %in% 对 data.table 进行子集筛选

3

我有一个data.table

library(data.table)
DT <- data.table(a=c(1,2,3,4), b=c(4,4,4,4), x=c(1,3,5,5))
> DT
   a b x
1: 1 4 1
2: 2 4 3
3: 3 4 5
4: 4 4 5

我想选择行,其中x等于ab。显然,我可以使用

> DT[x==a | x==b]
   a b x
1: 1 4 1

这将会得到正确的结果。然而,当有许多列时,我认为以下内容同样有效。

> DT[x%in%c(a,b)]
   a b x
1: 1 4 1
2: 2 4 3

但它给出的结果与我的直觉不同,有人能帮忙吗?


1
c(a,b) is essentially combining those two vectors: the a column in DT and the b column in DT, which is 1 2 3 4 4 4 4 4 - Ben
3个回答

5

这个表达式

 DT[x==a | x==b]

返回所有在DT中,其中xa的值相等或者xb的值相等的行。这是期望得到的结果。

另一方面,

 DT[x%in%c(a,b)]

返回符合条件 c(a, b) 中任何值与 x 相匹配的所有行,而不仅仅是对应值。因此,你的第二行出现是因为 x == 3 并且 a 中 (某处) 出现了 3


2
我们可以使用 Reduce.SDcols 来处理多个列。在 .SDcols 中指定感兴趣的列,然后循环遍历 .SD (Data.table的子集),对比 'x' 使用==,并使用 | 将其归约为单个逻辑向量。
DT[DT[, Reduce(`|`, lapply(.SD, `==`, x)), .SDcols = a:b]]
#   a b x
#1: 1 4 1

1
另一种方法是使用rowSums
DT[rowSums(DT[,.SD,.SDcols=-'x']==x)>0,]
#   a b x
#1: 1 4 1

如果你想选择所有列都等于的行,可以改为rowMeans...==1

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