Накопительная сумма в окне (или текущая сумма окна) на основе условия в 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 Может кто-нибудь объяснить, Метод Майка в этой теме? Вроде бы быстро. Однако я не совсем уверен, что там происходит. Я видел, что кто-то запросил какой-то комментарий, но я не уверен, что он говорит само за себя.
Заранее спасибо. Я боролся с этой проблемой в течение двух дней.