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()技术吗?

最佳答案

您可以使用ddply稍微缩短transform代码:

ddply(data.frame(x=x, id=1:10), .(x %% 2),transform,y = x - mean(x))


但是我认为ddply和其他plyr函数并不是真的要复制您描述的ave功能。对于拆分和重组单个原子向量,tapply(和ave)可能是完成此任务的正确工具。

08-26 08:36