dplyr 中的滞后滚动间隔 window

Lagged rolling interval window in dplyr

我有一个类似 df 的数据集,其中 year_month 表示前 2 位数字中的年份,以及月份最后 2 位数字 (1901=01/2019).

id <- c(1,1,1,1,1,2,2,2,2,2)
year_month <- c(1801,1809,1812,1901,1908, 1901,1909,1912,2011,2012 )
value <- c(10,20,30,40,50,60,70,80,90,100)

df <- data.frame(id, year_month, value)

我想总结每个公司在过去一年中的累计价值(例如,如果我们在 1901=01/2019,我想从 1801 年开始计算(01 /2018) 并记录 1901 年之前的历史值,即从 1801 年到 1812 年)。数据集看起来像 one_year_window

value_last_year <- c(NA,10,30,60,90,NA,60,130,80,170)

one_year_window <- data.frame(id, year_month, value, value_last_year)

我在 dplyr 中尝试了几种方法 (cummsum()) 都没有成功。

有线索吗?

df %>% 
  group_by(id, year = round(year_month, -2)) %>% 
  mutate(value_last_year = cumsum(value)) %>%
  ungroup(year) %>% 
  mutate(value_last_year = ifelse(year == max(year), value, NA)) %>% 
  ungroup() %>%
  select(-year)

尽管计算所有年份的累计总和然后按 idyear_month 过滤可能对您有利(如果您需要他们的最新记录)。

输出

      id year_month value value_last_year
   <dbl>      <dbl> <dbl>           <dbl>
 1     1       1801    10              NA
 2     1       1809    20              NA
 3     1       1812    30              NA
 4     1       1901    40              40
 5     1       1908    50              50
 6     2       1901    60              NA
 7     2       1909    70              NA
 8     2       1912    80              NA
 9     2       2011    90              90
10     2       2012   100             100

更新

基于您更新后的 post。我不相信这个答案。您应该关注此 link 并在此处投票支持基于以下内容的答案:

library(dplyr)
library(lubridate)
library(zoo)

df %>% 
  mutate(yrmd = ymd(paste0(year_month, "01"))) %>% 
  group_by(id) %>% 
  mutate(value_last_year = rollapplyr(value, width = 1:n() - findInterval(yrmd %m-% months(13), yrmd), sum),
         value_last_year = ifelse(row_number() == 1, NA, value_last_year - value)) %>% 
  select(-yrmd) %>% 
  ungroup()

输出

      id year_month value value_last_year
   <dbl>      <dbl> <dbl>           <dbl>
 1     1       1801    10              NA
 2     1       1809    20              30
 3     1       1812    30              60
 4     1       1901    40              90
 5     1       1908    50             140
 6     2       1901    60              NA
 7     2       1909    70             130
 8     2       1912    80             210
 9     2       2011    90             170
10     2       2012   100             190