过滤同一列中多个条件的data.table

时间:2014-11-14 10:30:01

标签: r data.table

我有以下data.table

> dt= data.table(num=c(1,2,1,1,2, 3, 3,2), letters[1:8])
> dt
   num V2
1:   1  a
2:   1  c
3:   1  d
4:   2  b
5:   2  e
6:   2  h
7:   3  f
8:   3  g

我想将所有num equals过滤为1和2并获得结果data.table。我可以这样做:

> dt[num==1 | num==2,]
   num V2
1:   1  a
2:   1  c
3:   1  d
4:   2  b
5:   2  e
6:   2  h

或者:

rbind(setkey(dt, num)[J(1)],setkey(dt, num)[J(2)])

但是有没有setkey的选项,所以第二个表达式更短,如:

setkey(dt, num)[1|2]

由于setkey代码对于非常大的数量来说更快...我会感激一些帮助!

1 个答案:

答案 0 :(得分:1)

除了KFB的评论之外:

setkey(dt, num)[num %in% c(1,2)]

如果过滤值是序列中的整数:

setkey(dt,num)[J(1:2)]    # OR 
setkey(dt,num)[seq]

如果它们是任意的:

setkey(dt,num)[J(c(1,2)]    

注意1:这可能不适用于data.table的旧版本 注2:.J的别名,更具可读性:

 setkey(dt,num)[.(1:2)]  

FWIW,我喜欢将magrittr包与data.table一起使用,并尽可能清楚地说明一切:

dt %>% setkey(num)
dt[ .(1:2) ]  

缺点是你不能在一条线上整齐地做到这一点。