Накопительная сумма в окне (или текущая сумма окна) на основе условия в R

Я пытаюсь вычислить совокупную сумму для данного окна на основе условия. Я видел потоки, где решение делает условную накопленную сумму Рассчитать условную промежуточную сумму в R для каждой строки во фрейме данных) и скользящая сумма Суммарная сумма по другой переменной в R), но я не мог найти их вместе. Я также видел, чтоdata.table @ нет функции скользящего окна вR data.table скользящее окно. Так что эта проблема для меня очень сложная.

Более того, решение опубликовано Майком Граханом по скользящей сумме выше моего понимания. Я ищуdata.table основанный метод в первую очередь для скорости. Тем не менее, я открыт для других методов, если они понятны.

Вот мои входные данные:

DFI <- structure(list(FY = c(2011, 2012, 2013, 2015, 2016, 2011, 2011, 
2012, 2013, 2014, 2015, 2010, 2016, 2013, 2014, 2015, 2010), 
    Customer = c(13575, 13575, 13575, 13575, 13575, 13575, 13575, 
    13575, 13575, 13575, 13575, 13578, 13578, 13578, 13578, 13578, 
    13578), Product = c("A", "A", "A", "A", "A", "B", "B", "B", 
    "B", "B", "B", "A", "A", "B", "C", "D", "E"), Rev = c(4, 
    3, 3, 1, 2, 1, 2, 3, 4, 5, 6, 3, 2, 2, 4, 2, 2)), .Names = c("FY", 
"Customer", "Product", "Rev"), row.names = c(NA, 17L), class = "data.frame")

Вот мой ожидаемый результат: (создан вручную; приношу свои извинения, если есть ошибка вручную)

DFO <- structure(list(FY = c(2011, 2012, 2013, 2015, 2016, 2011, 2012, 
2013, 2014, 2015, 2010, 2016, 2013, 2014, 2015, 2010), Customer = c(13575, 
13575, 13575, 13575, 13575, 13575, 13575, 13575, 13575, 13575, 
13578, 13578, 13578, 13578, 13578, 13578), Product = c("A", "A", 
"A", "A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "C", "D", 
"E"), Rev = c(4, 3, 3, 1, 2, 3, 3, 4, 5, 6, 3, 2, 2, 4, 2, 2), 
    cumsum = c(4, 7, 10, 11, 9, 3, 6, 10, 15, 21, 3, 2, 2, 4, 
    2, 2)), .Names = c("FY", "Customer", "Product", "Rev", "cumsum"
), row.names = c(NA, 16L), class = "data.frame")

Некоторые комментарии о логике:

1) Я хочу найти скользящую сумму за 5 лет. В идеале я бы хотел, чтобы этот 5-летний период был переменным, то есть что-то, что я могу указать в другом месте кода. Таким образом, я могу позже изменить окно для своего анализа.

2) Конец окна основан на максимальном году (т.е.FY в приведенном выше примере). В приведенном выше примере, максFY вDFI является2016. Таким образом, начальный год окна будет2016 - 5 + 1 = 2012 для всех записей в2016.

3) Сумма окна (или текущая сумма) рассчитывается какCustomer и для конкретногоProduct.

Что я пытался:

Я хотел попробовать что-то перед публикацией. Вот мой код:

  DFI <- data.table::as.data.table(DFI)

  #Sort it first
  DFI<-DFI[order(Customer,FY),]

  #find cumulative sum; remove Rev column; order rows
  DFOTest<-DFI[,cumsum := cumsum(Rev),by=.(Customer,Product)][,.SD[which.max(cumsum)],by=.(FY,Customer,Product)][,("Rev"):=NULL][order(Customer,Product,FY)]

Этот код рассчитывает совокупную сумму, но я не могу определить 5-летнее окно и затем рассчитать промежуточную сумму. У меня два вопроса:

Вопрос 1 Как рассчитать 5-летнюю промежуточную сумму?

Вопрос 2 Может кто-нибудь объяснить, Метод Майка в этой теме? Вроде бы быстро. Однако я не совсем уверен, что там происходит. Я видел, что кто-то запросил какой-то комментарий, но я не уверен, что он говорит само за себя.

Заранее спасибо. Я боролся с этой проблемой в течение двух дней.

Ответы на вопрос(4)

Ваш ответ на вопрос