Generating a moving sum variable in R

后端 未结 3 1998
盖世英雄少女心
盖世英雄少女心 2021-02-09 07:16

I suspect this is a somewhat simple question with multiple solutions, but I\'m still a bit of a novice in R and an exhaustive search didn\'t yield answers that spoke well to wha

3条回答
  •  深忆病人
    2021-02-09 07:42

    If DF is the input three-column data frame then use ave with rollapplyr from zoo. Note that we use a width of k+1 and then drop the k+1st element from the sum so that the current value of x is excluded and only the remaining k values are summed:

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

    which gives:

       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
    

提交回复
热议问题