【问题标题】:data.table equivalent of dplyr::%in% using the ! (not) operatordata.table 等效于 dplyr::%in% 使用 ! (非)运算符
【发布时间】:2020-02-20 17:00:59
【问题描述】:

R中的data.table包语法中是否有以下代码的等效版本?

以下代码行在 mtcars 数据集中过滤出不包含集合 (4,6) 中的 cyl 值的行

在 dplyr 中,此代码如下所示:

mtcars %>% filter(!(cyl %in% c(4,6)))

在 data.table 中是否有一个等效的语法来执行一个嵌套的 %in% 操作!不是运算符来过滤表中的行?

您可以通过以下代码运行示例:

library(tidyverse) 
mtcars %>% filter(!(cyl %in% c(4,6)))

【问题讨论】:

  • 似乎是一个未解决的问题:github.com/Rdatatable/data.table/issues/4152
  • @MrFlick 该死的 - 不认为这是一个未解决的问题,甚至不存在!我想我可能会等待 - 或者只是转换回 tibble 然后 data.table
  • as.data.table(mtcars)[!cyl %in% c(4,6),] 为我工作,我错过了什么吗?
  • 另外,%in% 不是 dplyr 函数。这是一个基本的R函数。它应该仍然可以在 data.table 中工作。
  • 我坚决不同意。会同意搜索可能有点令人困惑,但这只是因为 SO 搜索的点击率很高:[r] [subset] [data.table]。 (超过 200 次点击)还使用带有 ?subset 的帮助系统(加载了 data.table 包,或 help(subset, pack=data.table)

标签: r dplyr data.table


【解决方案1】:

像这样?下面是如何对data.table 中的行进行子集化。与您的dplyr 代码相比,!(cyl %in% c(4,6)) 部分与您的原始代码完全相同。所以在这种情况下,你唯一需要学习的是dt[..code.., ]df %>% filter(..code..) 等价,其中..code.. 是评估每一行条件的逻辑语句。

library(data.table)
dat <- mtcars
setDT(dat)[!(cyl %in% c(4,6)), ]
#      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#  1: 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#  2: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#  3: 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#  4: 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#  5: 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#  6: 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#  7: 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#  8: 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#  9: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
# 10: 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
# 11: 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
# 12: 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
# 13: 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
# 14: 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

【讨论】:

  • 效果很好 - 似乎过滤到正确的行!
  • 或许值得明确说明,一般来说,dplyr 中的df %&gt;% filter(..code..) 与数据表中的dt[..code.., ]subset(dt, ..code..) 相同。 x %in% y!(x %in% y) 或任何其他返回逻辑值的表达式没有什么特别之处。
  • @GregorThomas 很好的建议。我根据您的建议修改了我的帖子。谢谢。
【解决方案2】:

data.tables 有一个subset 方法。它的语法与data.frame 方法相同:

dat <- mtcars
subset( setDT(dat), !(cyl %in% c(4,6))  )
#-----------------
     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
 1: 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
 2: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
 3: 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
 4: 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
 5: 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
 6: 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
 7: 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
 8: 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
 9: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
10: 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
11: 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
12: 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
13: 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
14: 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

?subset.data.table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多