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