当新列名作为字符向量给出时,在 `data.table` 中分组数据的好方法

Nice way to group data in a `data.table` when the new column name is given as a character vector

换句话说,当新列的名称是字符向量时,我的问题是关于 data.tablej 参数。例如:

dt <- data.table(x = c(1, 1, 2, 2, 3, 3), y = rnorm(6))
agg_col_name <- 'avg'

grouped_dt <- dt[, .(z = mean(y)), by = x]
setnames(grouped_dt, 'z', agg_col_name)
> grouped_dt
   x        avg
1: 1 -0.2554987
2: 2 -0.4245852
3: 3 -0.4881073

应该有更优雅的方式将最后两个语句作为一个语句,是吗?

也许这是一个关于如何为 j 参数创建合适的 list 的问题。

虽然可能不是你要找的东西,但你可以在里面使用 setNames,它环绕着 (.(z = mean(y))

library(data.table)

dt[, setNames(.(z = mean(y)), agg_col_name), by = x]

或者做完总结后使用setnames:

setnames(dt[, mean(y), by = x], 'V1', agg_col_name)[]

输出

   x        avg
1: 1  0.5626526
2: 2  0.3549653
3: 3 -0.2861405

但是,正如评论中所说,data.table的dev版本更容易做到。您可以在 [programming on data.table #4304]:(https://github.com/Rdatatable/data.table/pull/4304).

查看更多关于此功能的开发信息
# Latest development version:
data.table::update.dev.pkg()

library(data.table)

dt[, .(z = mean(y)), by = x, env = list(z=agg_col_name)]

#   x        avg
#1: 1 -0.1640783
#2: 2  0.5375794
#3: 3  0.1539785