我喜欢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语法的理解吗。
答案 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