类似于' ave'在普利尔?

时间:2011-12-27 16:44:03

标签: r grouping plyr

R ave()函数比其名称更有用 - 它基本上是tapply()的一个版本,它允许您返回与输入长度相同的向量,并将这些值插回到相同的位置订购作为您的输入。

> x <- 1:10
> ave(x, x %% 2, FUN=function(d) d-mean(d))
 [1] -4 -4 -2 -2  0  0  2  2  4  4

您可以使用ddply()获得类似的效果,但它需要一些额外的数据副本,以及几个辅助变量:

> x <- 1:10
> val <- ddply(data.frame(x=x, id=1:10), .(x %% 2), 
     function(d) {d$y <- d$x-mean(d$x); d})
> val[order(val$id),]$y
 [1] -4 -4 -2 -2  0  0  2  2  4  4

是否有其他plyr技术与ave()的轻量级方法相匹配?

2 个答案:

答案 0 :(得分:8)

您可以使用ddply

稍微缩短transform代码
ddply(data.frame(x=x, id=1:10), .(x %% 2),transform,y = x - mean(x))

但我不认为ddply和其他 plyr 函数真正意味着复制您描述的ave的功能。对于分裂和重组单个原子向量,tapply(和ave)可能是适合这项工作的正确工具。

答案 1 :(得分:5)

我最近写了a blog post比较ave,ddply和data.table的速度。我建议你看看data.table,它可能证明是有益的。如果有人对自我推销感到不满,请提前抱歉。