我想编写一个函数来分析我需要在每个标识变量组合上聚合/分组/拆分的数据集。不幸的是,测量变量很多,经常改变并枚举它们会导致输入中的代码和错误。
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可能是一个解决方案。
答案 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]