2015-05-13 50 views
2

我有个问题让我意想不到的麻烦。这个问题看起来很简单,我想根据几个条件对data.table进行子集划分。我们来考虑一下这个例子。想像我有一个data.table像下面的那个。现在,我想从中推断出一个子集,使得a> = 1045和< = 1180和(b ==“c”或b ==“d”)。如何根据几个条件对数据表进行子集

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

我读了data.table指南和常见问题解答,并搜查了论坛,但我似乎还没有找到任何东西是相关的。如果你认为这个问题毫无意义,我很抱歉。

回答

3

您可以尝试

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

或者作为@大卫Arenburg评论,between可用于

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

@DavidArenburg你的意思是基地R操作会起作用吗? – akrun

+0

@DavidArenburg我相信你的话。如果有人抱怨,我会直接面向你:-) – akrun

+0

非常感谢这两个! :)我甚至在你建议的代码之前尝试过,但是它没有起作用的原因是因为我的一列是一个因素,逻辑上'小于或等于'是不允许的。 – Riccardo

1

更多data.table -y溶液(后首先定义idas.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] 
相关问题