我可以完成这项任务,但我觉得必须有一种“最佳”(最巧妙、最紧凑、最清晰的代码、最快?)
对于一组指定的分类因子,我想按组构建一个均值和方差表。
生成数据 :
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/