如何从plyr输出总结而不是长

时间:2011-03-10 00:55:14

标签: r each plyr

我喜欢plyr将数据帧拆分成多个数据集然后在每个集合上执行相同操作的能力。最好的部分是它将结果显示为一个整洁紧凑的井标记表。我喜欢使用each()将一堆计算放入一行。但是,我不明白为什么在ddply参数中使用sumrize函数会破坏输出并使其变长并且没有标记。看看这里看看我的意思。你能告诉我我做错了什么吗?我更喜欢使用摘要。

让我们首先设置一个示例数据框。想象一下,你在一项研究中有60名参与者。其中20个很有趣,20个很聪明,20个很好。然后每个科目都得到了分数。

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

现在我想要一张表格,显示三种类型人群的平均分数,中位数分数,最低分数和最高分数

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语法的理解吗。

2 个答案:

答案 0 :(得分:5)

拼写出函数,如:

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

以您想要的格式生成输出。

我认为你的问题是each()正在返回一个向量,summarize()并没有按照你想要的方式处理它。

答案 1 :(得分: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