在plyr包中与'ave'函数类似的函数是什么?

5

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技术?

2个回答

8

您可以通过使用transformddply代码缩短:

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

但我并不认为 ddply 和其他 plyr 函数真的旨在复制你描述的 ave 的功能。对于拆分和重新组合单个原子向量,tapply(和ave)可能是正确的工具。


是的,ave 在 plyr 中的等效函数就是 ave ;) Plyr 的基本原理是处理比单个向量更大的对象 - 基础 R 已经提供了你所需的一切。 - hadley

5

我最近写了一篇关于速度方面比较ave、ddply和data.table的博客文章。我建议你看看data.table,它可能会有所帮助。如果有人对自我推广感到不满,我提前道歉。


哦,是啊,我忘了街区上的另一个孩子。=)谢谢你的自我推广,我一定会研究一下的。 - Ken Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接