r - 构建均值/方差汇总表的快速/优雅方法

标签 r aggregate plyr reshape2

我可以完成这项任务,但我觉得必须有一种“最佳”(最巧妙、最紧凑、最清晰的代码、最快?)

对于一组指定的分类因子,我想按组构建一个均值和方差表。

生成数据 :

set.seed(1001)
d <- expand.grid(f1=LETTERS[1:3],f2=letters[1:3],
                 f3=factor(as.character(as.roman(1:3))),rep=1:4)
d$y <- runif(nrow(d))
d$z <- rnorm(nrow(d))

所需的输出 :
  f1 f2  f3    y.mean      y.var
1  A  a   I 0.6502307 0.09537958
2  A  a  II 0.4876630 0.11079670
3  A  a III 0.3102926 0.20280568
4  A  b   I 0.3914084 0.05869310
5  A  b  II 0.5257355 0.21863126
6  A  b III 0.3356860 0.07943314
... etc. ...

使用 aggregate/merge :
library(reshape)
m1 <- aggregate(y~f1*f2*f3,data=d,FUN=mean)
m2 <- aggregate(y~f1*f2*f3,data=d,FUN=var)
mvtab <- merge(rename(m1,c(y="y.mean")),
      rename(m2,c(y="y.var")))

使用 ddply/summarise (可能是最好的,但一直无法使其工作):
mvtab2 <- ddply(subset(d,select=-c(z,rep)),
                .(f1,f2,f3),
                summarise,numcolwise(mean),numcolwise(var))

结果是
Error in output[[var]][rng] <- df[[var]] : 
  incompatible types (from closure to logical) in subassignment type fix

使用 melt/cast (也许最好?)
mvtab3 <- cast(melt(subset(d,select=-c(z,rep)),
          id.vars=1:3),
     ...~.,fun.aggregate=c(mean,var))
## now have to drop "variable"
mvtab3 <- subset(mvtab3,select=-variable)
## also should rename response variables

不会 (?) 在 reshape2 中工作.讲解...~.对某人来说可能很棘手!

最佳答案

我有点不解。这行不通:

mvtab2 <- ddply(d,.(f1,f2,f3),
            summarise,y.mean = mean(y),y.var = var(y))

这给了我这样的东西:
   f1 f2  f3    y.mean       y.var
1   A  a   I 0.6502307 0.095379578
2   A  a  II 0.4876630 0.110796695
3   A  a III 0.3102926 0.202805677
4   A  b   I 0.3914084 0.058693103
5   A  b  II 0.5257355 0.218631264

这是正确的形式,但看起来值与您指定的值不同。

编辑

以下是如何使用 numcolwise 制作您的版本工作:
mvtab2 <- ddply(subset(d,select=-c(z,rep)),.(f1,f2,f3),summarise,
                y.mean = numcolwise(mean)(piece),
                y.var = numcolwise(var)(piece)) 

您忘记将实际数据传递给 numcolwise .然后是小 ddply每件作品都被称为的技巧piece内部。 (不应该依赖 Hadley 在评论中指出的内容,因为它可能会在 plyr 的 future 版本中发生变化。)

关于r - 构建均值/方差汇总表的快速/优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7449198/

相关文章:

r - 如何根据R中其他数据帧中的信息创建矩阵?

r - 合并 data.frame 中的行

r - 加速 R 计算的操作

r - 列的中位数,然后查找其他列值? (右)

python - 使用 $set 和aggregate 更新 MongoDB 集合

r - ddply + 汇总函数列名输入

R Studio 无法正确处理中文字符

r - 将 text2vec 嵌入应用于新数据

从函数返回数据框的名称

r - 我需要帮助思考如何拆分数据框以执行操作