Это в значительной степени вопрос скользящей суммы.froll()
, скорее всего, сработает, но сначала вам нужно будет заполнить набор данных, чтобы вы могли сказать, сколько дней откатиться назад.
Здесь я делаю неравное самостоятельное соединение.Так как data.table хочет, чтобы все поля были сгенерированы перед объединением, мне нужно добавить столбец Dates_Lower = Dates-30
, чтобы я мог выполнить неравные условия.Моя цепочка с last(Value)
заставляет ее работать, но я не всегда уверен в этих самосоединениях ...
Я также конвертирую дату в as.Date
, а также переименовываю ее, так как Date()
является базовойфункция.
library(data.table)
dt <- data.table(ContractID= c(1,1,1,2,2)
, Dates = as.Date(c("2018-02-01", "2018-02-20", "2018-03-12", "2018-02-01", "2018-02-12"))
, Value = c(10,20,30,10,20))
dt[dt[, .(ContractID, Dates, Dates_Lower = Dates - 30, Value)] #self-join
,on = .(ContractID = ContractID
, Dates >= Dates_Lower
, Dates <= Dates
)
, j = .(ContractID, Dates, Value)
, allow.cartesian = TRUE
][, j = .(Value = last(Value), Cum_Sum_1M = sum(Value))
,by = .(ContractID, Dates)
]
ContractID Dates Value Cum_Sum_1M
1: 1 2018-02-01 10 10
2: 1 2018-02-20 20 30
3: 1 2018-03-12 30 50
4: 2 2018-02-01 10 10
5: 2 2018-02-12 20 30