当新列名作为字符向量给出时,在 `data.table` 中分组数据的好方法
Nice way to group data in a `data.table` when the new column name is given as a character vector
换句话说,当新列的名称是字符向量时,我的问题是关于 data.table
的 j
参数。例如:
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
换句话说,当新列的名称是字符向量时,我的问题是关于 data.table
的 j
参数。例如:
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