【发布时间】:2015-02-23 17:12:12
【问题描述】:
我有一个包含分数集和分组变量集的数据框,例如:
s1 s2 s3 g1 g2 g3
4 3 7 F F T
6 2 2 T T T
2 4 9 G G F
1 3 1 T F G
我想运行一个聚合,目前我正在做:
aggregate(df[c("s1","s2","s3")],df["g1"],function(x) c(m =mean(x, na.rm=T), sd = sd(x, na.rm=T), n = length(x)))
我只想要一行代码,这样我就可以同时按多个因素聚合多个变量。注意我不是想通过 g1-3 的组合来获得 s1-3 的摘要(根据答案here)。我已经查看了doBy 包中的summaryBy,但这似乎又是对每个因素进行组合,而不仅仅是一个整体,这不是我想要的(虽然很有用!)。我一直在玩变体:
apply(df[c("g1","g2","g3")], 2, function (z) aggregate(df[c("s1","s2","s3")],z,function(x) c(m =mean(x, na.rm=T), sd = sd(x, na.rm=T), n = length(x)))
但我得到错误:“'by' 必须是一个列表”。我想我可以用loop 来解决这个问题,我知道使用各种版本的ddply 或reshape 你可以获得聚合但最直观的方法(至少对我来说)似乎是@987654330 @ 和 aggregate - 我错过了什么?
【问题讨论】:
-
期望的输出是什么?
-
我不介意,我假设一个列表。我更喜欢使用数据框,但似乎将输出集重塑为 df 确实是一个单独的问题
-
@sjgknight 你可以试试
lapply(paste0('g',1:3), function(y) aggregate(cbind(s1,s2,s3)~., df[c(y,paste0('s',1:3))], function(x) c(mean=mean(x, na.rm=T), sd=sd(x, na.rm=T), n=length(x)))) -
为了重现性的目的,我试图制作一个简化的例子,但实际上列名并不像那样统一,试图适应:
lapply(c("IQ","PL"), function(y) aggregate(explor+sourDiv+sourQual+otherEval+Topic~., df[c(y,explor,sourDiv,sourQual,otherEval,Topic)], function(x) c(mean(x, na.rm=T), sd(x, na.rm=T), length(x))))我得到一个“对象'探索'不是找到”错误(但它是 df 中的命名列)。 -
@sjgknight 好的,现在我明白了问题所在。应该是
df[c(y, 'explor', 'sourDiv', 'sourQual',...)]
标签: r aggregate nested-loops apply summary