data.table 相当于 dplyr 的 bang bang (!!)

问题描述 投票:0回答:3

假设我有以下

DT
ID

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
3个回答
6
投票

是的,只需将变量包装在

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

3
投票

我喜欢维生素B16的答案适用于

i=
(以及
j=
)部分的
data.table::[
。但是,我相信从调用环境引用对象的canonical响应是
..
运算符,此处讨论: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
中。 (我相信这在
.SD
i=
中有效,因为它最初是在
DT
j=
中评估的......也许很复杂。)

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

0
投票

您也可以使用

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("column_name")]

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

vignette("datatable-secondary-indices-and-auto-indexing")
© www.soinside.com 2019 - 2024. All rights reserved.