【发布时间】:2022-01-13 08:13:54
【问题描述】:
考虑标准 data.table 语法DT[i, j, ...]。由于.SD 仅在j 和i 中的NULL 中定义,是否有任何方法可以隐式(期望)或显式(通过.SD 之类的东西)在函数中引用当前data.table i?
用例
我想编写一个过滤标准列的函数。列名在多个表中是相同的,而且有些冗长。为了通过减少打字来加快我的编码速度,我想写一个这样的函数:
library(data.table)
dt <- data.table(postal_code = c("USA123", "SPEEDO", "USA421"),
customer_name = c("Taylor", "Walker", "Thompson"))
dt
#> postal_code customer_name
#> 1: USA123 Taylor
#> 2: SPEEDO Walker
#> 3: USA421 Thompson
# Filter all customers from a common postal code
# that surname starts with specific letters
extract <- function(x, y, DT) {
DT[, startsWith(postal_code, x) & startsWith(customer_name, y)]
}
# does not work
dt[extract("USA", "T", .SD)]
#> Error in .checkTypos(e, names_x): Object 'postal_code' not found.
#> Perhaps you intended postal_code
# works but requires specifying the data.table explicitly
# plus the drawback that it cannot be called upon, e.g. a grouped .SD
# in a nested call
dt[extract("USA", "T", dt)]
#> postal_code customer_name
#> 1: USA123 Taylor
#> 2: USA421 Thompson
想要的(伪代码)
dt[extract("USA", "T")]
#> postal_code customer_name
#> 1: USA123 Taylor
#> 2: USA421 Thompson
# but also
# subsequent steps in j
dt[extract("USA", "T"), relevant := TRUE][]
#> postal_code customer_name relevant
#> 1: USA123 Taylor TRUE
#> 2: SPEEDO Walker NA
#> 3: USA421 Thompson TRUE
# using other data.tables
another_dt[extract("USA", "T")]
yet_another_dt[extract("USA", "T")]
【问题讨论】:
-
似乎
fcase可以处理您的第二个用例:dt[, relevant := fcase(extract("USA", "T", dt), TRUE, default = NA)][]。您是否有其他fcase无法处理的用途? -
感谢您的评论。我知道有多种方法可以在
j中产生所需的结果。但是,我真的很想触发i中的所有内容,因为它更加通用和方便。通常我首先检查过滤的行并随后更新它们。此外,dt[extract("USA", "T"), relevant := TRUE]比dt[, relevant := fcase(extract("USA", "T", dt), TRUE, default = NA)]更易读。它不是关于“我怎样才能得到这个结果”,而是非常具体到“我怎样才能在i中使用这样的功能。 -
诚然它不那么可读,但是这个答案中的方法不会提供所需的多功能性吗? stackoverflow.com/a/57091155/9463489
-
仅作记录,我认为这可能是一个相关的(未解决的)问题:New symbol .D to refer to x in i
-
@jblood94 不完全是因为我不得不再次输入
dt,我尽量避免。
标签: r data.table self-reference