2012-03-10 15 views
10

私はRの初心者です。私はおそらく非常に簡単なことをするのに苦労しています。私は大きなデータセットを国別にグループに分け、国別に3ヶ月の価格指数の平均を取って、それを適切な月に一致する新しい列に入れたいと思っています。ノー成功(下記のコードとエラーメッセージ)で、このようrollmean使用しようとしてきた:グループでローリング平均を適用する

> leader$last3<-tapply(leader, leader$ccode, 
    function(x) rollmean(leader$GI_delta, 3, na.pad=T)) 
Error in tapply(leader, leader$ccode, function(x) rollmean(leader$GI_delta, : 
    arguments must have same length 

> leader$last3<-ddply(leader, .(ccode), 
    rollmean(GI_delta, 3, na.pad=T)) 

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress, : 
    .fun is not a function. 

すべてのヘルプははるかに高く評価されるだろう!

答えて

5

最初の試みでは、関数はx引数を使用せず、常に を返し、常に同じもの(間違ったサイズのベクトル)を返します。 さらに、最初の引数はベクトルでなければなりません。 最後に、tapplyはベクトルのリストを返します。 結果を直接data.frameに入れることはできません。 2番目の例では

library(zoo) 
n <- 10 
leader <- data.frame(
    ccode = rep(LETTERS[1:3],each=n), 
    GI_delta = rnorm(3*n) 
) 
tapply(
    leader$GI_delta, 
    leader$ccode, 
    function(x) rollmean(x, 3, na.pad=TRUE) 
) 

plyr の3番目の引数は関数ではなく、表現する必要があります。 あなたが表現を使用する場合は、あなたは、(transform は変わらない行数を維持しながらsummarizeは、ccodeの各値に対して1行のdata.frame を返す)関数としてsummarize またはtransformを使用 して置くことができますより多くの議論としての表現。

library(plyr) 
ddply(
    leader, "ccode", 
    transform, 
    last3 = rollmean(GI_delta, 3, align="right", na.pad=TRUE) 
) 
+0

あなたの助けに感謝Vincent! –

13

新しい列を作成する場合は、aveを試してください。これはtapplyに似ていますが、最初の引数と同じ長さのベクトルを返します。私の経験は、ddplyよりもずっと速いということです。

require(zoo) 
leader$last3<-ave(leader$GI_delta, leader$ccode, 
         FUN= function(x) rollmean(x, k=3, na.pad=T)) 
+0

ありがとう、これは素晴らしいです! –

関連する問題