【问题标题】:Filter data.table on multiple criteria in the same column根据同一列中的多个条件过滤 data.table
【发布时间】:2014-12-12 22:19:51
【问题描述】:

我有以下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 等于 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 代码对于非常大的数量来说更快......我将不胜感激!

【问题讨论】:

  • 喜欢这个setkey(dt, num)[num %in% c(1,2)] ?

标签: r data.table


【解决方案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) ]  

缺点是你不能在一行中整齐地做到这一点。

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 2023-03-20
    • 2018-07-16
    • 2021-01-27
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多