2011-12-27 25 views
4

R的ave()功能比其名稱暗示的方式更有用 - 它基本上是tapply()的一個版本,它允許您返回與輸入相同長度的矢量,並將這些值重新插入與輸入相同的順序。plyr中的'ave'類比嗎?

> 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()獲得輕量級的方法嗎?

回答

8

可以稍微用transform縮短ddply代碼:

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

,但我不認爲ddplyplyr功能真正的意思複製的ave你描述的功能。對於拆分和重組單個原子矢量,tapply(和ave)可能是該工作的正確工具。

+0

是的,ave'的plyr相當於'ave';)Plyr基本上是基於大於單個矢量的物體的基礎上工作的 - base R提供您需要的一切。 – hadley 2011-12-28 21:00:16

5

我最近寫了a blog post比較ave,ddply和data.table的速度。我建議你看看data.table,它可能是有益的。如果任何人冒犯了自我推銷,請提前抱歉。

+0

哦,是的,我忘了塊上的其他孩子。 =)感謝您的自我推銷,我一定會考慮這一點。 – 2011-12-27 18:28:33