如何根据几个条件对数据 table 进行子集化

How to subset a data table according to several conditions

我有一个问题给我带来了意想不到的麻烦。这个问题看起来非常简单,是我想根据一些条件对 data.table 进行子集化。让我们考虑这个例子;想象一下我有一个 data.table 如下所示。现在,我想从中推断出一个子集,使得 a>=1045 和 a<=1180 和 (b=="c" or b=="d").

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

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

你可以试试

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

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

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

更多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,否则我们将只是 return 一切——如果你有第三个变量,它会更容易区分,它会返回为 NA 用于不匹配的组合键)

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


一个更简洁的方法(基本上不需要我们自己指定回收)是使用 CJ 函数:

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