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