【问题标题】:data.table's equivalent of dplyr's bang bang (!!)data.table 相当于 dplyr bang bang (!!)
【发布时间】:2022-01-06 08:12:24
【问题描述】:

假设我在下面有这个DTID

library(data.table)
DT <- data.table(
  ID = c("b","b","b","a","a","c"),
  a = 1:6,
  b = 7:12,
  c = 13:18
)

ID <- "b"
DT
#>    ID a  b  c
#> 1:  b 1  7 13
#> 2:  b 2  8 14
#> 3:  b 3  9 15
#> 4:  a 4 10 16
#> 5:  a 5 11 17
#> 6:  c 6 12 18

是否有 {data.table} 等效于 {dplyr} 的:

DT |> dplyr::filter(ID == !!ID)
#>    ID a b  c
#> 1:  b 1 7 13
#> 2:  b 2 8 14
#> 3:  b 3 9 15

假设我不更改变量的名称。

【问题讨论】:

  • 为什么不简单地改变变量名?

标签: r dplyr data.table


【解决方案1】:

使用on:

DT[ID, on = "ID"]
#>    ID a b  c
#> 1:  b 1 7 13
#> 2:  b 2 8 14
#> 3:  b 3 9 15

语法是:DT[row_value, on = c("variable")]

运行此命令以获取更多信息:

vignette("datatable-secondary-indices-and-auto-indexing")

【讨论】:

    【解决方案2】:

    我喜欢维生素B16 的答案在data.table::[i=(以及j=)部分有效。但是,我相信从调用环境引用对象的规范响应是..-operator,在这里讨论:https://rdatatable.gitlab.io/data.table/articles/datatable-intro.html

    很遗憾,它在i= 中不起作用,

    DT[ID == ..ID,]
    # Error in eval(stub[[3L]], x, enclos) : object '..ID' not found
    

    所以必须放在.SD。 (我相信这在.SDi= 中有效,因为它最初是在DTj= 中评估的......也许很复杂。)

    DT[, .SD[ID == ..ID,] ]
    #        ID     a     b     c
    #    <char> <int> <int> <int>
    # 1:      b     1     7    13
    # 2:      b     2     8    14
    # 3:      b     3     9    15
    

    【讨论】:

    • 第二行现在显示 col 类,是 DT 的新版本吗?
    • 这是在 1.13.0 中添加的,带有 833702a,带有参数 print.data.table(..., class=TRUE)options(datatable.print.class=TRUE)。我现在倾向于经常阅读更普通的函数文档,但这在?print.data.table 中列出:-)
    • 编辑:我倾向于经常阅读更普通的函数文档...
    【解决方案3】:

    是的,只需将变量包装在as.name()

    DT[ID == as.name(ID)]
    
    #    ID a b  c
    # 1:  b 1 7 13
    # 2:  b 2 8 14
    # 3:  b 3 9 15
    

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2021-03-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2021-12-04
      • 2020-07-20
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多