首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过ddply或其他R函数进行多级聚合(如“分组集”)?

通过ddply或其他R函数进行多级聚合(如“分组集”)?
EN

Stack Overflow用户
提问于 2014-01-26 16:34:04
回答 2查看 961关注 0票数 4

我希望能够通过多个列进行聚合,获得的结果不仅是最好的聚合(每个分组列中有一个值),而且还可以获得更高级别的聚合(来自一个分组列的一个值,对其他分组列没有限制,等等)。我相信Oracle和Hive可以通过“分组集”(也是Hive中的“多维数据集”和“汇总”)来实现这一点。

这段代码实现了我想要的结果:

代码语言:javascript
运行
复制
rbind.fill(ddply(mtcars, .(cyl), summarize, agg=mean(mpg)),
           ddply(mtcars, .(cyl, am), summarize, agg=mean(mpg)))[, c(1,3,2)]

  cyl am      agg
1   4 NA 26.66364
2   6 NA 19.74286
3   8 NA 15.10000
4   4  0 22.90000
5   4  1 28.07500
6   6  0 19.12500
7   6  1 20.56667
8   8  0 15.05000
9   8  1 15.40000

但这在几个方面是丑陋的。对于我的实际应用程序,要执行的聚合的定义很长,我真的不想重复它。有什么优雅的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-26 17:15:59

我想这能做你想做的事:

代码语言:javascript
运行
复制
library(plyr)
grp.cols <- c("vs", "am", "gear", "carb", "cyl")
do.call(
  rbind.fill,
  lapply(1:length(grp.cols), function(x) ddply(mtcars, grp.cols[1:x], summarize, agg=mean(mpg)))
)
票数 3
EN

Stack Overflow用户

发布于 2018-05-09 00:22:26

v1.11.0中,data.table具有rollupcubegroupingsets的功能。简戈雷基第1377期中给出了这个问题的答案

代码语言:javascript
运行
复制
library(data.table)
rollup(as.data.table(mtcars), j=.(agg=mean(mpg)), by=c("cyl", "am"))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21366138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档