11

私は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.

どんな助けでも大歓迎です!

4

2 に答える 2

14

新しい列を作成する場合は、 を使用してみてください ave。似てtapplyいますが、最初の引数と同じ長さのベクトルを返します。私の経験では、次のものよりもはるかに高速ですddply

require(zoo)
leader$last3<-ave(leader$GI_delta, leader$ccode, 
                         FUN= function(x) rollmean(x, k=3, na.pad=T) )
于 2012-03-10T12:12:59.613 に答える
5

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

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)
)

2番目の例では、の3番目の引数はplyr 式ではなく関数である必要があります。式を使用する場合は、summarize またはtransformを関数として使用し(行数を変更せずに、summarizeの値ごとに1行のdata.frameを返します )、式を追加の引数として配置できます。ccodetransform

library(plyr)
ddply(
  leader, "ccode",
  transform,
  last3 = rollmean( GI_delta, 3, align="right", na.pad=TRUE )
)
于 2012-03-10T07:03:38.530 に答える