【问题标题】:using %in% to subset a data.table使用 %in% 对 data.table 进行子集化
【发布时间】:2020-07-24 06:01:39
【问题描述】:

我有一个数据表

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

但它给出的结果对我来说并不直观。任何人都可以帮忙吗?

【问题讨论】:

  • c(a,b) 本质上是结合这两个向量:DT 中的a 列和DT 中的b 列,即1 2 3 4 4 4 4 4

标签: r data.table subset


【解决方案1】:

表达式

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

返回DT 中的所有行,其中xa 中的值相等或xb 相等。这是想要的结果。

另一方面

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

返回xc(a, b) 中的任何 值匹配的所有行,而不仅仅是相应的值。因此出现第二行是因为x == 33 出现在a 中(某处)。

【讨论】:

    【解决方案2】:

    我们可以将Reduce.SDcols 一起用于多个列。在.SDcols 中指定感兴趣的列,然后遍历.SD(Data.table 的子集),与'x' 进行比较(==),并将Reduce 与@ 与单个逻辑向量进行比较987654327@

    DT[DT[, Reduce(`|`, lapply(.SD, `==`, x)), .SDcols = a:b]]
    #   a b x
    #1: 1 4 1
    

    【讨论】:

      【解决方案3】:

      另一种方法是使用rowSums

      DT[rowSums(DT[,.SD,.SDcols=-'x']==x)>0,]
      #   a b x
      #1: 1 4 1
      

      如果要选择所有列等于x的行,可以更改为rowMeans...==1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 2016-10-29
        • 2021-07-23
        • 2021-12-18
        • 1970-01-01
        • 2019-09-07
        相关资源
        最近更新 更多