我有一个数据表,如下所示:
我必须进行前滚总和,并通过以下方法进行
id <- c(rep(1,9))
date <- c('2018-01-01 15:00:33', '2018-01-01 15:05:31', '2018-01-01 15:10:12','2018-01-01 15:15:33', '2018-01-01 15:20:48', '2018-01-01 15:25:41','2018-01-01 15:30:27', '2018-01-01 15:35:18', '2018-01-01 16:40:08')
value=c(12,36,30,15,18,39,21,24,27)
dt=data.table(id,date,value)
dt[,rolled_sum_value:=Reduce(`+`,shift(value,0:5,type="lead")),by="id"]
现在我有一个约束,滚动窗口应该为30分钟,因此在这种情况下,第四行而不是144,我需要它是117(15 + 18 + 39 + 21 + 24),而不是第九行,因为它是144大于30分钟的窗口2018-01-01 16:40:08
。
感谢您的帮助。
答案 0 :(得分:1)
您可以进行非等额加入:
# use a datetime class so time differences make sense
dt[, date := as.POSIXct(date)]
dt[, v :=
dt[.(id = id, d_dn = date, d_up = date + 30*60), on=.(id, date >= d_dn, date <= d_up),
sum(value), by=.EACHI]$V1
]
id date value v
1: 1 2018-01-01 15:00:33 12 171
2: 1 2018-01-01 15:05:31 36 183
3: 1 2018-01-01 15:10:12 30 147
4: 1 2018-01-01 15:15:33 15 117
5: 1 2018-01-01 15:20:48 18 102
6: 1 2018-01-01 15:25:41 39 84
7: 1 2018-01-01 15:30:27 21 45
8: 1 2018-01-01 15:35:18 24 24
9: 1 2018-01-01 16:40:08 27 27