如何按条件滚动总和?

时间:2018-11-05 07:14:32

标签: r data.table

我有一个数据表,如下所示:

我必须进行前滚总和,并通过以下方法进行

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

感谢您的帮助。

1 个答案:

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