【问题标题】:How to subset a data table according to several conditions如何根据几个条件对数据表进行子集化
【发布时间】:2015-05-13 14:05:34
【问题描述】:

我有一个问题给我带来了意想不到的麻烦。这个问题似乎非常简单,我想根据几个条件对data.table 进行子集化。让我们考虑这个例子;想象一下,我有一个data.table,如下所示。现在,我想从中推断出一个子集,即 a>=1045 和 a

dt<-data.table(a=(1000:1200), b=sample(letters[1:3], size=201, replace=T))

我阅读了data.table 指南和常见问题解答并搜索了论坛,但我似乎没有找到任何相关的内容。如果您认为这个问题毫无意义,我提前道歉。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    你可以试试

    dt[a>=1045 & a <=1180 & b %chin% c('c', 'd')]
    

    或者正如@David Arenburg 评论的那样,可以使用between

    dt[between(a, 1045, 1180) & b %chin% c('c', 'd')]
    

    【讨论】:

    • @DavidArenburg 我相信你的话。如果有人抱怨,我会把它指向你:-)
    • 非常感谢两位! :) 我什至在您建议的代码之前尝试过,但它不起作用的原因是因为我的 a 列是一个因素,并且不允许逻辑“小于或等于”。
    • @Riccardo %chin% 适用于 character 类而不是因素
    • 谢谢。为了使它起作用,我只是将类从因子更改为数字
    • @Riccardo 如果是第一列a,那么你必须遵循as.numeric(as.character( 路线或as.numeric(levels(a))[a]。我猜你已经这样做了
    【解决方案2】:

    更多data.table-y 解决方案(先将id 定义为as.factor(1000:1200)),即利用二分查找:

    setkey(dt,a,b)
    dt[.(rep(paste0(1045:1180),2),rep(c("b","c"),each=136)),nomatch=0L]
    

    (我们必须指定nomatch,因为否则我们将返回所有内容——如果您有第三个变量会更容易区分,对于不匹配的组合键,它将返回为NA

    (当然,如果您将a 转换为数字,我们不需要paste0 位)


    使用CJ 函数是一种更简洁的方法(基本上不必自己指定回收):

    setkey(dt,a,b)
    dt[CJ(paste0(1045:1180),c("c","d")),nomatch=0L]
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2015-11-27
      • 2022-08-19
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多