2013-07-10 10 views
5

これは多少の単純な問題ですが、私はまだRの初心者ですが、網羅的な検索では、私はやりたい移動合計変数を生成するR

データフレーム内の変数の「移動合計」を作成しようとしています。これらは3年と5年の合計で、1年遅れです。したがって、1986年の観測の5年間の合計は、1981年、1982年、1983年、1984年、1985年の過去の観測値の合計になります。ここでは、私がしたいことの例を示します。観測年前の5年間ですべてのxの合計。

country  year  x  x5yrsum 
    A   1980  9  NA 
    A   1981  3  NA 
    A   1982  5  NA 
    A   1983  6  NA 
    A   1984  9  NA 
    A   1985  7  32 
    A   1986  9  30 
    A   1987  4  36 

    ..................... 

    B   1990  0  NA 
    B   1991  4  NA 
    B   1992  2  NA 
    B   1993  6  NA 
    B   1994  3  NA 
    B   1995  7  15 
    B   1996  0  22 

これはアンバランスパネルデータです。私はddplyが適切だろうと思うが、私はそれのための正確なコーディングを知らないだろう。

すべての入力をいただければ幸いです。

+0

'zoo'パッケージの'?rollsum'を見てください。 'aggregate'、' data.table'または 'ddply'と組み合わせて、あなたは設定されるべきです。 – Justin

答えて

7

あなたはddplyfilter(または「スプリット・適用・コンバイン」のアプローチを実装する他の関数)を使用することができます。

library(plyr) 
ddply(DF, .(country), transform, 
      x5yrsum2 = as.numeric(filter(x,c(0,rep(1,5)),sides=1))) 

# country year x x5yrsum x5yrsum2 
# 1  A 1980 9  NA  NA 
# 2  A 1981 3  NA  NA 
# 3  A 1982 5  NA  NA 
# 4  A 1983 6  NA  NA 
# 5  A 1984 9  NA  NA 
# 6  A 1985 7  32  32 
# 7  A 1986 9  30  30 
# 8  A 1987 4  36  36 
# 9  B 1990 0  NA  NA 
# 10  B 1991 4  NA  NA 
# 11  B 1992 2  NA  NA 
# 12  B 1993 6  NA  NA 
# 13  B 1994 3  NA  NA 
# 14  B 1995 7  15  15 
# 15  B 1996 0  22  22 
3

DFは入力3列のデータ・フレームの場合、からrollapplyraveを使用します動物園我々はk+1の幅を使用することに注意してくださいとxの現在の値が除外され、唯一の残りk値が加算されるように、次いで、和からK + 1番目の要素をドロップ:

library(zoo) 

k <- 5 
roll <- function(x) rollapplyr(x, k+1, function(x) sum(x[-k-1]), fill = NA) 
transform(DF, xSyrsum = ave(x, country, FUN = roll)) 

与える:

country year x xSyrsum 
1  A 1980 9  NA 
2  A 1981 3  NA 
3  A 1982 5  NA 
4  A 1983 6  NA 
5  A 1984 9  NA 
6  A 1985 7  32 
7  A 1986 9  30 
8  A 1987 4  36 
9  B 1990 0  NA 
10  B 1991 4  NA 
11  B 1992 2  NA 
12  B 1993 6  NA 
13  B 1994 3  NA 
14  B 1995 7  15 
15  B 1996 0  22