有人可以通过以下示例帮助我理解aggregate和ddply之间的区别:
数据框:
mydat <- data.frame(first = rpois(10,10), second = rpois(10,10),
third = rpois(10,10), group = c(rep("a",5),rep("b",5)))
Run Code Online (Sandbox Code Playgroud)
使用aggregate将函数应用于按因子分割的数据框的一部分:
aggregate(mydat[,1:3], by=list(mydat$group), mean)
Group.1 first second third
1 a 8.8 8.8 10.2
2 b 6.8 9.4 13.4
Run Code Online (Sandbox Code Playgroud)
尝试将聚合用于另一个函数(返回错误消息):
aggregate(mydat[,1:3], by=list(mydat$group), function(u) cor(u$first,u$second))
Error in u$second : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud)
现在,尝试使用ddply(plyr包):
ddply(mydat, .(group), function(u) cor(u$first,u$second))
group V1
1 a -0.5083042
2 b -0.6329968
Run Code Online (Sandbox Code Playgroud)
所有提示,链接,批评都非常感谢.
Mat*_*erg 14
aggregate每个列独立调用FUN,这就是你获得独立手段的原因. ddply将所有列传递给该函数.aggregate可以按顺序快速演示传入的内容:
一些示例数据用于演示:
d <- data.frame(a=1:4, b=5:8, c=c(1,1,2,2))
> d
a b c
1 1 5 1
2 2 6 1
3 3 7 2
4 4 8 2
Run Code Online (Sandbox Code Playgroud)
通过使用该功能print,而忽略了命令的结果aggregate或者ddply,我们可以看到被传递到每个迭代的功能.
aggregate:
tmp <- aggregate(d[1:2], by=list(d$c), print)
[1] 1 2
[1] 3 4
[1] 5 6
[1] 7 8
Run Code Online (Sandbox Code Playgroud)
请注意,将发送单个列进行打印.
ddply:
tmp <- ddply(d, .(c), print)
a b c
1 1 5 1
2 2 6 1
a b c
3 3 7 2
4 4 8 2
Run Code Online (Sandbox Code Playgroud)
请注意,数据帧正在发送以进行打印.
你已经被告知为什么aggregate错误的{base}函数用于需要两个向量作为参数的函数,但是你还没有被告知哪个非ddply方法会成功.
该by( ... grp, FUN)方法:
> cbind (by( mydat, mydat["group"], function(d) cor(d$first, d$second)) )
[,1]
a 0.6529822
b -0.1964186
Run Code Online (Sandbox Code Playgroud)
该sapply(split( ..., grp), fn)方法
> sapply( split( mydat, mydat["group"]), function(d) cor(d$first, d$second))
a b
0.6529822 -0.1964186
Run Code Online (Sandbox Code Playgroud)
@MatthewLundberg的答案是非常好的,我的它不是一个答案,但它只是我想要看到一些R函数调用背后发生的事情时使用的一般提示.我使用debug命令browser.
aggregate(mydat[,1:3], by=list(mydat$group),
+ function(x){
+ browser()
+ mean(x)
+ })
Called from: FUN(X[[1L]], ...)
Browse[1]> x
[1] 16 10 16 13 25
Run Code Online (Sandbox Code Playgroud)
然后为ddply
ddply(mydat, .(group), function(u) {
+ browser()
+ cor(u$first,u$second)
+ })
Called from: .fun(piece, ...)
Browse[1]> u
first second third group
1 16 8 9 a
2 10 6 6 a
3 16 6 10 a
4 13 8 10 a
5 25 10 4 a
Run Code Online (Sandbox Code Playgroud)
编辑自己调试错误
在这里,我使用该技术来了解您收到错误的原因
aggregate(mydat[,1:3], by=list(mydat$group), function(u) {
+ browser()
+ cor(u$first,u$second)
+ })
Called from: FUN(X[[1L]], ...)
Browse[1]> u
[1] 16 10 16 13 25
Run Code Online (Sandbox Code Playgroud)
如你所见,你是一个原子向量(没有列名)所以如果你尝试
Browse[1]> u$first
Run Code Online (Sandbox Code Playgroud)
你收到一个错误:
Error in u$first : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud)