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
有没有其他与ave()
轻量级方法相匹配的plyr
技术?
ave
在 plyr 中的等效函数就是ave
;) Plyr 的基本原理是处理比单个向量更大的对象 - 基础 R 已经提供了你所需的一切。 - hadley