For this type of problem, the plyr package is truly phenomenal. Here is the code that gives you what you want, essentially one line of code plus a small helper function.
library(plyr) library(zoo) library(pwt) # First recreate dataset, using package pwt data(pwt6.3) pwt <- pwt6.3[ pwt6.3$country %in% c("Argentina", "Venezuela"), c("country", "isocode", "year", "pop", "ci", "rgdpch") ] # Use rollmean() in zoo as basis for defining a rolling 5-period rolling mean rollmean5 <- function(x){ rollmean(x, 5) } # Use ddply() in plyr package to create rolling average per country pwt.ma <- ddply(pwt, .(country), numcolwise(rollmean5))
Here is the result of this:
> head(pwt, 10) country isocode year pop ci rgdpch ARG-1950 Argentina ARG 1950 17150.34 13.29214 7736.338 ARG-1951 Argentina ARG 1951 17517.34 18.44502 8004.031 ARG-1952 Argentina ARG 1952 17876.96 17.76067 7372.721 ARG-1953 Argentina ARG 1953 18230.82 18.36526 7543.169 ARG-1954 Argentina ARG 1954 18580.56 16.98211 7661.550 ARG-1955 Argentina ARG 1955 18927.82 17.48891 8072.900 ARG-1956 Argentina ARG 1956 19271.51 15.90776 8098.133 ARG-1957 Argentina ARG 1957 19610.54 17.02845 8299.749 ARG-1958 Argentina ARG 1958 19946.54 17.54160 8714.951 ARG-1959 Argentina ARG 1959 20281.15 16.13731 8125.515 > head(pwt.ma) country year pop ci rgdpch 1 Argentina 1952 17871.20 16.96904 7663.562 2 Argentina 1953 18226.70 17.80839 7730.874 3 Argentina 1954 18577.53 17.30094 7749.694 4 Argentina 1955 18924.25 17.15450 7935.100 5 Argentina 1956 19267.39 16.98977 8169.456 6 Argentina 1957 19607.51 16.82080 8262.250
Note that rollmean () computes a centered average by default. You can change this behavior to get left or right movement by passing this parameter to an auxiliary function.
EDIT:
@ Joris Mays affectionately pointed out that you can actually be after an average of five years.
Here is the modified code for this:
pwt$period <- cut(pwt$year, seq(1900, 2100, 5)) pwt.ma <- ddply(pwt, .(country, period), numcolwise(mean)) pwt.ma
And the conclusion:
> pwt.ma country period year pop ci rgdpch 1 Argentina (1945,1950] 1950.0 17150.336 13.29214 7736.338 2 Argentina (1950,1955] 1953.0 18226.699 17.80839 7730.874 3 Argentina (1955,1960] 1958.0 19945.149 17.42693 8410.610 4 Argentina (1960,1965] 1963.0 21616.623 19.09067 9000.918 5 Argentina (1965,1970] 1968.0 23273.736 18.89005 10202.665 6 Argentina (1970,1975] 1973.0 25216.339 19.70203 11348.321 7 Argentina (1975,1980] 1978.0 27445.430 23.34439 11907.939 8 Argentina (1980,1985] 1983.0 29774.778 17.58909 10987.538 9 Argentina (1985,1990] 1988.0 32095.227 15.17531 10313.375 10 Argentina (1990,1995] 1993.0 34399.829 17.96758 11221.807 11 Argentina (1995,2000] 1998.0 36512.422 19.03551 12652.849 12 Argentina (2000,2005] 2003.0 38390.719 15.22084 12308.493 13 Argentina (2005,2010] 2006.5 39831.625 21.11783 14885.227 14 Venezuela (1945,1950] 1950.0 5009.006 41.07972 7067.947 15 Venezuela (1950,1955] 1953.0 5684.009 44.60849 8132.041 16 Venezuela (1955,1960] 1958.0 6988.078 37.87946 9468.001 17 Venezuela (1960,1965] 1963.0 8451.073 26.93877 9958.935 18 Venezuela (1965,1970] 1968.0 10056.910 28.66512 11083.242 19 Venezuela (1970,1975] 1973.0 11903.185 32.02671 12862.966 20 Venezuela (1975,1980] 1978.0 13927.882 36.35687 13530.556 21 Venezuela (1980,1985] 1983.0 16082.694 22.21093 10762.718 22 Venezuela (1985,1990] 1988.0 18382.964 19.48447 10376.123 23 Venezuela (1990,1995] 1993.0 20680.645 19.82371 10988.096 24 Venezuela (1995,2000] 1998.0 22739.062 20.93509 10837.580 25 Venezuela (2000,2005] 2003.0 24550.973 17.33936 10085.322 26 Venezuela (2005,2010] 2006.5 25832.495 24.35465 11790.497