R计算data.frame内滞后变量的总和

R calculate the sum of a lagged variable within a data.frame

我想使用基数 R 计算 data.frame 中从 t-12 到 t-1 的变量总和。例如,在下面的代码中,我试图计算 HOURS 的总和从 MONTH t-12 到 MONTH t-1(按名称)。非常感谢任何帮助。

DF <- data.frame(c(expand.grid(NAME = c("Frank", "Tony", "Edward"), YEAR = c(2014:2015), MONTH = c(1:12))), HOURS = rnorm(72))

DF <- DF[with(DF, order(NAME, YEAR, MONTH)), ]

DF

DF <- within(DF, WORK <- sum(c(rep(NA, 1), head(HOURS, -1)):c(rep(NA, 12), head(HOURS, -12))))

使用 dplyrRcppRoll:

library(RcppRoll)
library(dplyr)
DF %>% group_by(NAME) %>%
       arrange(YEAR, MONTH) %>%
       mutate(sum = c(NA, roll_sum(HOURS, 12, fill = NA, align = "right"))[-n()])

这是基本的 R 方法(至少在不使用 dplyr 进行分组或链接方面,但仍然使用包进行滚动总和)。我使用了 zoo 包的 rollsum 函数,但是,根据@jeremycg 的回答,您也可以使用 RcppRoll 中的 roll_sum。如果您甚至不想为滚动总和使用包,您可以根据需要滚动自己的函数(没有双关语)。

library(zoo)

DF = DF[order(DF$NAME, DF$YEAR, DF$MONTH),]  

DF$sum = unlist(lapply(unique(DF$NAME), function(x) {
  c(NA, rollsum(DF$HOURS[DF$NAME==x], 12, na.pad=TRUE, align="right")[-length(DF$NAME[DF$NAME==x])])
}))