这是使用ddply的plyr单行变体:
dt <- data.frame(age=rchisq(20,10),group=sample(1:2,20,rep=T))
ddply(dt,~group,summarise,mean=mean(age),sd=sd(age))
这是另一个使用新包data.table的单行变体。
dtf <- data.frame(age=rchisq(100000,10),group=factor(sample(1:10,100000,rep=T)))
dt <- data.table(dtf)
dt[,list(mean=mean(age),sd=sd(age)),by=group]
这个速度更快,尽管这仅在具有 100k 行的表上很明显。配备 2.53 Ghz Core 2 Duo 处理器和 R 2.11.1 的 Macbook Pro 上的计时:
> system.time(aa <- ddply(dtf,~group,summarise,mean=mean(age),sd=sd(age)))
utilisateur système écoulé
0.513 0.180 0.692
> system.time(aa <- dt[,list(mean=mean(age),sd=sd(age)),by=group])
utilisateur système écoulé
0.087 0.018 0.103
如果我们使用,可以进一步节省setkey
:
> setkey(dt,group)
> system.time(dt[,list(mean=mean(age),sd=sd(age)),by=group])
utilisateur système écoulé
0.040 0.007 0.048