【发布时间】:2018-11-28 09:27:44
【问题描述】:
我有一个包含许多列的数据框,其中一些是度量变量。我想使用 data.table 从后者中提取一堆汇总统计信息。我的问题如下:如何根据使用的函数重命名聚合列?
我想要一个聚合的 data.table,其列名如下:c("measure1_mean", "measure1_sd", "measure2_mean", "measure2_sd", ...)
我的代码如下所示:
library(data.table)
library(stringr)
dt <- data.table(meas1=1:10,
meas2=seq(5,25, length.out = 10),
meas3=rnorm(10),
groupvar=rep(LETTERS[1:5], each=2))
measure_cols <- colnames(dt)[str_detect(colnames(dt), "^meas")]
dt_agg <- dt[, c(lapply(.SD, mean),
lapply(.SD, sd)),
by=groupvar, .SDcols = measure_cols]
# Does not work because of duplicates in rep(measure_cols, 3)
agg_names <- c(measure_cols, paste(rep(c("mean", "sd"), each=length(measure_cols)), measure_cols, sep="_"))
setnames(dt_agg, rep(measure_cols,3), agg_names)
此块有效地提取统计信息,但返回具有相同名称的列。因此我不能使用像setnames(dt, old, new) 这样的东西,因为我的“旧”向量中存在重复项。
我看到了这个帖子:Rename aggregated columns using data.table in R。但我不喜欢接受的解决方案,因为它依赖列索引而不是名称来重命名列。
【问题讨论】:
-
请展示一个可重现的小例子
-
根据@Henrik 给出的第一个链接,
dt[, as.list(unlist(lapply(.SD, function(meas) list(mean=mean(meas), sd=sd(meas))))), by=groupvar, .SDcols = measure_cols]直接为您提供您所追求的 -
@Henrik 感谢您将我指向相关帖子。我发现语法相当违反直觉,但它就像一个魅力!
标签: r data.table