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

时间:2015-05-13 14:05:35

标签: r data.table

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

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

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

2 个答案:

答案 0 :(得分:3)

你可以尝试

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

或者@David Arenburg评论说,可以使用between

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

答案 1 :(得分:1)

更多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]