在data.table
中,对于非引用的j表达式,我希望能够使用字符向量来设置结果列的名称。
由于我处于“分组依据”设置中,因此无法使用按引用语法,因为这会引入许多重复的行。由于在这种情况下可以将j表达式指定为列表,所以我的解决方案是使用stats::setNames()
。但是,这给了我一条消息(将来甚至可能变成警告)。如何在没有data.table
抱怨效率的情况下实现目标?
my_fun <- function(tbl, new_names = c("mean", "var")) {
tbl[, setNames(list(mean(b), var(b)), new_names), by = "a", verbose = TRUE]
}
dt <- data.table::data.table(
a = sample(letters[1:5], 1e3, replace = TRUE),
b = rnorm(1e3)
)
my_fun(dt)
结果如预期:
a mean var
1: a -0.04117688 1.1080222
2: e 0.00158758 1.1629461
3: c -0.04328856 0.9848994
4: d -0.04832948 0.8760644
5: b 0.10856561 0.9313874
我想摆脱以下消息:
组成每个组并运行j(GForce FALSE)... j的结果是一个命名列表。为每个组一遍又一遍地创建相同的名称是非常低效的。当j = list(...)时,为了提高效率,会在分组完成后检测,删除并放回任何名称。例如,使用j = transform()可以防止加速(考虑更改为:=)。此消息将来可能会升级为警告。
答案 0 :(得分:0)
将其更改为“制作每个组并运行j(GForce TRUE)... 0.000sec”:
my_fun <- function(tbl, new_names = c("a", "mean", "var")) {
setNames(tbl[, list(mean(b), var(b)), by = "a", verbose = TRUE], new_names)
}
my_fun(dt)