2011-03-10 77 views
3

我喜欢plyr将数据帧分成多个数据集然后在每个数据集上执行相同操作的能力。最好的部分是当它将结果显示为一个整齐紧凑的标签表格时。我喜欢使用each()将一堆计算投入到一行中。但是,我不明白为什么在ddply参数中使用汇总功能会导致输出失败,并使其输出很长并且没有标签。看看这里,看看我的意思。你能告诉我我做错了什么吗?我更喜欢使用总结。如何从plyr输出宽而不是长的总结

让我们先设置一个示例数据框。想象一下,你有60人参加了一项研究。其中20个很有趣,20个很聪明,20个很好。然后每个主题都得到一个分数。

type<-rep(c("funny","clever", "nice"),20) 
score<-rnorm(60)+10 
data<-data.frame(type,score) 

现在我想展示的平均分,平均分,最低分和最高分每个3种类型的人

ddply(data,.(type), summarise, each(mean,median,min,max)(score)) 

线上面应该给一个漂亮的表(表3行 - 每种类型1和4列数据)。唉,它只给出一整列长表,只有一列数字,其中没有一列标出。

ddply(data,.(type), function(jjkk) each(mean,median,min,max)(jjkk$score)) 

上面的代码给了我想要的。你能解释我对ddply语法的理解吗?

回答

5

拼写出的功能,如在:

ddply(data,"type", summarise, mean=mean(score),median=median(score),max=max(score),min=min(score)) 

按您所希望的格式输出。

我认为你的问题是,each()正在返回一个向量,其中summarize()是不是真的以你打算的方式处理。

4

嗯...我太累了,想想一个班轮,但reshape会做的伎俩:

library(reshape) 
library(plyr) 
mdtf <- melt(data) 
cast(mdtf, type ~ ., each(min, max, mean, median)) 
    type  min  max  mean median 
1 clever 7.808648 12.08930 10.125563 10.27269 
2 funny 8.302777 12.04066 9.941331 10.07333 
3 nice 8.442508 11.80132 10.085667 10.07261