Cumulative sum in a window (or running window sum) based on a condition in R

前端 未结 4 698
傲寒
傲寒 2020-12-17 17:19

I am trying to calculate cumulative sum for a given window based on a condition. I have seen threads where the solution does conditional cumulative sum (Calculate a conditio

4条回答
  •  春和景丽
    2020-12-17 18:08

    Not a new tidyverse answer but I think nest helps with readability

    library(tidyverse)
    library(zoo)
    
    roll_cumsum <- function(df) {
                      df %>%
                         complete(FY = full_seq(FY, period=1)) %>%
                         mutate(roll_cumsum = rollapplyr(Rev, 5, sum, na.rm=TRUE, partial=TRUE))
                   }
    
    DFI %>%
      group_by_at(vars(-Rev)) %>%
      summarise(Rev = sum(Rev)) %>%
      group_by(Customer, Product) %>%
      nest(FY, Rev) %>%
      mutate(data = map(data, ~roll_cumsum(.x))) %>%
      unnest() %>%
      filter(!is.na(Rev)) %>%
      arrange(Customer, Product, FY)
    
    # A tibble: 16 x 5
       # Customer Product    FY   Rev roll_cumsum
          #             
     # 1    13575 A        2011  4.00        4.00
     # 2    13575 A        2012  3.00        7.00
     # 3    13575 A        2013  3.00       10.0 
     # 4    13575 A        2015  1.00       11.0 
     # 5    13575 A        2016  2.00        9.00
     # 6    13575 B        2011  3.00        3.00
     # 7    13575 B        2012  3.00        6.00
     # 8    13575 B        2013  4.00       10.0 
     # 9    13575 B        2014  5.00       15.0 
    # 10    13575 B        2015  6.00       21.0 
    # 11    13578 A        2010  3.00        3.00
    # 12    13578 A        2016  2.00        2.00
    # 13    13578 B        2013  2.00        2.00
    # 14    13578 C        2014  4.00        4.00
    # 15    13578 D        2015  2.00        2.00
    # 16    13578 E        2010  2.00        2.00 
    

提交回复
热议问题