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
)可能是完成此任务的正确工具。