【问题标题】:Rename multiple aggregated columns using data.table in R [duplicate]使用 R 中的 data.table 重命名多个聚合列 [重复]
【发布时间】: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


【解决方案1】:
library(data.table)

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]

您可以创建一个带有名称的向量...使用 each 参数将函数粘贴到 measure_cols 后面的名称。

function.names <- c("mean", "sd")
column.names <- paste0( measure_cols, "_", rep( function.names, each = length( measure_cols ) ) )
setnames( dt_agg, c("groupvar", column.names ))

#    groupvar meas1_mean meas2_mean meas3_mean  meas1_sd meas2_sd  meas3_sd
# 1:        A        1.5   6.111111  0.2346044 0.7071068 1.571348 1.6733804
# 2:        B        3.5  10.555556  0.5144621 0.7071068 1.571348 0.0894364
# 3:        C        5.5  15.000000 -0.5469839 0.7071068 1.571348 2.1689620
# 4:        D        7.5  19.444444 -0.3898213 0.7071068 1.571348 1.0007027
# 5:        E        9.5  23.888889  0.5569743 0.7071068 1.571348 1.4499413

【讨论】:

  • 感谢您的回答!但是,这仍然依赖于您的列以这种方式排序的假设,我特别想避免这种情况。
  • @majpark 您确定计算平均值、标准差等的行中列的顺序...因此它们将始终与使用相同函数顺序创建的向量对齐...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2013-06-15
  • 1970-01-01
  • 2020-06-21
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多