如何在没有明确命名的情况下按测量变量的总和进行分组?

时间:2012-04-06 00:31:01

标签: r aggregate plyr

我想编写一个函数来分析我需要在每个标识变量组合上聚合/分组/拆分的数据集。不幸的是,测量变量很多,经常改变并枚举它们会导致输入中的代码和错误。

dat <- data.frame(id.a=c('aa','bb','aa','bb'),id.b=c('x','y','x','x'),m.c=c(1:4),m.d=c(5:8)) 
id.vars <- c('id.a', 'id.b')
measure.vars <- setdiff(names(dat),id.vars)

我想总结一下我的测量变量。我找到了方法,但他们都是hacky。结果将是

id.a id.b m.c m.d
1   aa    x   4  12
2   bb    y   2   6
3   bb    x   4   8

我认为reshape2或ddply可能是一个解决方案。

3 个答案:

答案 0 :(得分:4)

使用您提供的代码:

dat <- data.frame(id.a=c('aa','bb','aa','bb'),id.b=c('x','y','x','x'),m.c=c(1:4),m.d=c(5:8)) 
id.vars <- c('id.a', 'id.b')
measure.vars <- setdiff(names(dat),id.vars)

然后运行:

aggregate(dat[measure.vars],dat[id.vars],sum)

产生

  id.a id.b m.c m.d
1   aa    x   4  12
2   bb    x   4   8
3   bb    y   2   6

答案 1 :(得分:3)

使用plyr:

ddply(dat, .(id.a,id.b), numcolwise(function(x) sum(x)))

答案 2 :(得分:2)

这是一个具有内存效率的data.table解决方案

dat <- data.frame(id.a=c('aa','bb','aa','bb'),id.b=c('x','y','x','x'),m.c=c(1:4),m.d=c(5:8)) 
id.vars <- c('id.a', 'id.b')
measure.vars <- setdiff(names(dat),id.vars)
DT <- as.data.table(dat)
DT[, lapply(.SD, sum), by = id.vars, .SDcols =measure.vars]
##   id.a id.b m.c m.d
## 1:   aa    x   4  12
## 2:   bb    y   2   6
## 3:   bb    x   4   8

假设所有非id列都是测量列(隐含在问题中,但没有明确说明为要求),那么以下内容将起作用

 DT[, lapply(.SD, sum), by = id.vars]