3

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

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)

我想总结一下我的测量变量。我找到了方法,但它们都很老套。结果将是

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 可能是一个解决方案。

4

3 回答 3

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
于 2012-04-06T01:05:53.657 回答
3

使用 plyr:

ddply(dat, .(id.a,id.b), numcolwise(function(x) sum(x)))
于 2012-04-06T01:29:30.000 回答
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]
于 2012-10-25T03:04:06.790 回答