如何解决ddply返回太多结果
| 由于某些原因,自升级到R-2.13.0以来,我得到的结果比预期的要多-并升级到plyr_1.5.1.tar.gz ...我在老版本的plyr上尝试了此操作(不幸的是,版本不确定因为我刚刚覆盖了它...)library(plyr)
dd <-data.frame(matrix(rnorm(216),72,3),c(rep(\"A\",24),rep(\"B\",rep(\"C\",24)),c(rep(\"J\",36),rep(\"K\",36)))
colnames(dd) <- c(\"v1\",\"v2\",\"v3\",\"dim1\",\"dim2\")
results1 <- ddply(dd,c(\"dim1\",\"dim2\"),function(df) c(m1=mean(df$v1)) )
results2 <- ddply(dd,function(df) { c(m1=mean(df$v1),m2=mean(df$v2)) } )
results3 <- ddply(dd,m2=mean(df$v2),m3=mean(df$v3)) } )
我不明白为什么结果2的结果的行数是结果1的两倍,而结果3的行数却是原来的三倍?
我有一个方便的R版本2.11.0修补程序(2010-05-01 r51907),使用的是plyr的旧版本,我期待的结果是...
> results1
dim1 dim2 m1
1 A J 0.07312783
2 B J -0.22428746
3 B K -0.44205832
4 C K 0.21421456
> results2
dim1 dim2 m1 m2
1 A J 0.07312783 -0.1130148
2 B J -0.22428746 0.4394832
3 B K -0.44205832 -0.1934018
4 C K 0.21421456 -0.0178809
> results3
dim1 dim2 m1 m2 m3
1 A J 0.07312783 -0.1130148 -0.03175873
2 B J -0.22428746 0.4394832 0.21581696
3 B K -0.44205832 -0.1934018 -0.28313530
4 C K 0.21421456 -0.0178809 -0.21948430
我从R版本2.13.0获得的结果(2011-04-13)
> results1
dim1 dim2 m1
1 A J -0.2270726
2 B J 0.5860493
3 B K -0.5986129
4 C K 0.3135809
> results2
dim1 dim2 m1 m2
1 A J -0.2270726 -0.19037813
2 B J 0.5860493 -0.05385395
3 B K -0.5986129 0.29404095
4 C K 0.3135809 -0.26744010
5 A J -0.2270726 -0.19037813
6 B J 0.5860493 -0.05385395
7 B K -0.5986129 0.29404095
8 C K 0.3135809 -0.26744010
> results3
dim1 dim2 m1 m2 m3
1 A J -0.2270726 -0.19037813 -0.20448734
2 B J 0.5860493 -0.05385395 -0.11190857
3 B K -0.5986129 0.29404095 -0.27072101
4 C K 0.3135809 -0.26744010 -0.03184949
5 A J -0.2270726 -0.19037813 -0.20448734
6 B J 0.5860493 -0.05385395 -0.11190857
7 B K -0.5986129 0.29404095 -0.27072101
8 C K 0.3135809 -0.26744010 -0.03184949
9 A J -0.2270726 -0.19037813 -0.20448734
10 B J 0.5860493 -0.05385395 -0.11190857
11 B K -0.5986129 0.29404095 -0.27072101
12 C K 0.3135809 -0.26744010 -0.03184949
为什么result2有8行而不是4行,而result3有12行而不是4行?
谢谢,
肖恩
解决方法
很快将在
plyr 1.5.2
中修复
,导致问题的原因是ddply()中的c()函数。
您可以通过以下三种替代方法来编写关于result3的语句,从而变得越来越简单:
在函数内使用data.frame:
ddply(dd,c(\"dim1\",\"dim2\"),function(df) {data.frame(m1=mean(df$v1),m2=mean(df$v2),m3=mean(df$v3)) } )
使用摘要:
ddply(dd,.(dim1,dim2),summarise,m1=mean(v1),m2=mean(v2),m3=mean(v3))
使用numcolwise。
ddply(dd,numcolwise(mean))
在每种情况下,结果都是您所期望的:
dim1 dim2 m1 m2 m3
1 A J -0.04272659 -0.1468376 0.17902942
2 B J -0.10133503 -0.1427358 -0.05241214
3 B K 0.29698847 -0.0989732 0.14422812
4 C K 0.04108324 0.2014864 -0.15893221
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。