2013-07-10 9 views
5

Tôi nghi ngờ đây là câu hỏi đơn giản với nhiều giải pháp, nhưng tôi vẫn là một người mới trong R và tìm kiếm toàn diện không mang lại câu trả lời tốt cho những gì tôi ' m muốn làm.Tạo biến số tiền di chuyển trong R

Tôi đang cố tạo, vì thiếu cụm từ tốt hơn, "số tiền di chuyển" cho một biến trong khung dữ liệu của tôi. Đây sẽ là khoản tiền 3 năm và 5 năm, bị trễ một năm. Vì vậy, một khoản tiền 5 năm cho một quan sát vào năm 1986 sẽ là tổng của tất cả các quan sát trước đó vào năm 1981, 1982, 1983, 1984 và 1985. Đây là một ví dụ về những gì tôi muốn làm, trong đó biến tổng là tổng của tất cả x trong năm năm trước năm quan sát.

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 

Đây là dữ liệu bảng điều khiển không cân bằng. Tôi nghi ngờ ddply sẽ là thích hợp, nhưng tôi sẽ không biết chính xác mã hóa cho nó.

Bất kỳ đầu vào nào cũng sẽ được đánh giá cao.

+0

Hãy xem '? Rollum' từ gói 'zoo'. Kết hợp với 'aggregate',' data.table' hoặc 'ddply' bạn nên đặt. – Justin

Trả lời

7

Bạn có thể sử dụng filter trong ddply (hoặc bất kỳ chức năng khác thực hiện việc tách "apply-kết hợp" cách tiếp cận):

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

Nếu DF là đầu vào ba cột khung dữ liệu sau đó sử dụng ave với rollapplyr từ vườn bách thú. Lưu ý rằng chúng tôi sử dụng rộng k+1 và sau đó thả k + yếu tố 1st từ tổng do đó giá trị hiện tại của x bị loại trừ và chỉ có k giá trị còn lại được tóm tắt:

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

mang đến cho:

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