2011-12-27 12 views
4

Rのave()関数は、その名前よりも便利です - 基本的にtapply()のバージョンで、入力と同じ長さのベクトルを返し、それらの値を入力と同じ順序に戻します。一致したいくつかの他のplyr技術がありplyrの 'ave'のアナログ?

> 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 

> 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()と同様の効果を得ることができますが、それは夫婦データの余分なコピーだけでなく、カップルの補助変数が必要です私はave()で得ることができる軽量なアプローチ?

答えて

8

あなたはややtransformを使用してddplyコードを短縮することができます

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

が、私はddplyおよびその他のplyr機能は本当にあなたが記述aveの機能を複製することを意図しているとは思いません。単一の原子ベクトルを分割して再結合するためには、tapply(およびave)がおそらくその仕事のための適切なツールです。

+0

はい、 'ave'のplyrに相当するのは' ave'です;)Plyrは根本的に単一のベクトルより大きなオブジェクトを扱うことに基づいています。 – hadley

5

最近、私はa blog postを書きました。速度に関しては、ave、ddply、およびdata.tableを比較しています。私はあなたがdata.tableを見てみることをお勧めします、それは有益であると証明するかもしれません。もし誰かが自己宣伝に嫌がらせをするのであれば、あらかじめ申し訳なく思う。

+0

ああ、私はブロック上の他の子供を忘れてしまった。 =)自己宣伝をありがとう、私はそれを確かに調べるでしょう。 –