быстрый / элегантный способ построения сводной таблицы среднего / дисперсии

Я могу выполнить эту задачу, но я чувствую, что должен быть "лучший" (самый гладкий, самый компактный, самый ясный код, самый быстрый?) способ сделать это, и пока не понял ...

Для определенного набора категориальных факторов я хочу построить таблицу средних и дисперсий по группам.

генерировать данные :

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. ...

с использованием агрегата / слияния :

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 / summarize (возможно, лучше, но не смог заставить его работать):

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 . Объясняя ... ~. кому-то может быть сложно!

21
задан Ben Bolker 28 August 2013 в 17:35
поделиться