【问题标题】:multiple aggregations on multiple variable on groups组上多个变量的多个聚合
【发布时间】:2017-07-07 21:15:58
【问题描述】:

我有一个 data.table,想在多个列上运行多个聚合,同时该表按另一个变量分组。我尝试了以下方法:

library(data.table)

DT <- data.table(a = 1:10,
                 b = 10:1,
                 group = rep(1:2, each=5))

aggs <- function(x) list(mean = mean(x), sd = sd(x))

DT[, lapply(.SD, aggs), .(group), .SDcols = c('a', 'b')]

这不太有效,因为我要么需要 names() 作为列,要么需要将输出拆分为列 - 例如 a.meanb.mean 等:

   group        a        b
1:     1        3        8
2:     1 1.581139 1.581139
3:     2        8        3
4:     2 1.581139 1.581139

【问题讨论】:

  • 关于this answer - 也许是melt(DT, id="group")[,Reduce(c, lapply(.SD, aggs)),"group,variable"]dcast(melt(DT, id="group")[,Reduce(c, lapply(.SD, aggs)),"group,variable"],group~variable, value.var=c("mean","sd"))
  • @lukeA 我想没有必要融化。 dcast(DT, group ~ ., fun = list(mean, sd), value.var = c("a","b")) 之类的东西,尽管不是 OP 的首选 col 名称。
  • 转换为宽格式通常是个坏主意,因为实际上不可能使用生成的数据集进行进一步分析。

标签: r data.table


【解决方案1】:

你很接近,错过了一个额外的 data.frame 来按你想要的方式投射结果:

DT[, data.frame(lapply(.SD, aggs)), by=group, .SDcols = c('a', 'b')]

给予:

   group a.mean     a.sd b.mean     b.sd
1:     1      3 1.581139      8 1.581139
2:     2      8 1.581139      3 1.581139

【讨论】:

    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多