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()
的轻量级方法相匹配?
答案 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,它可能证明是有益的。如果有人对自我推销感到不满,请提前抱歉。