R:非标准窗口上的滚动求和

R:非标准窗口上的滚动求和,r,dplyr,rolling-sum,R,Dplyr,Rolling Sum,我有一个不规则的时间序列,我试图在3个月的时间窗口内用R来计算与ID相关的每个操作的滚动总和 数据结构如下 ID Operation date value A 1 01/01/2017 0 A 2 01/02/2017 1 A 3 01/06/2017 1 A 4 01/09/2017 0 B 1

我有一个不规则的时间序列,我试图在3个月的时间窗口内用R来计算与ID相关的每个操作的滚动总和

数据结构如下

ID    Operation    date         value
A         1       01/01/2017      0
A         2       01/02/2017      1
A         3       01/06/2017      1
A         4       01/09/2017      0
B         1       01/03/2017      0
B         2       01/05/2017      1
B         3       01/09/2017      0
B         4       01/10/2017      1
我正在寻找这个输出

ID    Operation    date         value   cumsum
A         1       01/01/2017      0        0
A         2       01/02/2017      1        1
A         3       01/06/2017      1        1
A         4       01/09/2017      0        1
B         1       01/03/2017      0        0
B         2       01/05/2017      1        1
B         3       01/09/2017      1        1
B         4       01/10/2017      1        2
现在我正在使用这个脚本

DB<-DB[with(DB,order(ID,date)),]
DB<-DB %>% group_by(ID) %>% mutate(cumsum = cumsum(value)) 

但它是过去所有操作的总和。如何引入3个月滚动总和?

不可能提前标记3个月窗口,因为您希望从数据集中的每个日期返回3个月,这意味着您的参考点日期每次都会更改。因此,您需要一个考虑到这一点并将其应用于每一行的函数

library(lubridate)
library(dplyr)

# sample dataset
dt = read.table(text="ID    Operation    date         value
                A         1       01/01/2017      0
                A         2       01/02/2017      1
                A         3       01/06/2017      1
                A         4       01/09/2017      0
                B         1       01/03/2017      0
                B         2       01/05/2017      1
                B         3       01/09/2017      1
                B         4       01/10/2017      1", header=T, stringsAsFactors=F)

# function that goes 3 months back from a given date and a given ID
f = function(ID_input, date_input) { 
  enddate = date_input
  startdate = date_input - months(3)
  sum((dt %>% filter(ID == ID_input & date >= startdate & date <= enddate))$value) }

f = Vectorize(f)

# update date column
dt$date = dmy(dt$date)

# run function for every row
dt %>% mutate(sumvalue = f(ID, date))


#   ID Operation       date value sumvalue
# 1  A         1 2017-01-01     0        0
# 2  A         2 2017-02-01     1        1
# 3  A         3 2017-06-01     1        1
# 4  A         4 2017-09-01     0        1
# 5  B         1 2017-03-01     0        0
# 6  B         2 2017-05-01     1        1
# 7  B         3 2017-09-01     1        1
# 8  B         4 2017-10-01     1        2

我见过rollmean函数,但它有一个标准窗口。日期是写为月/日/年还是日期/月/年?日期是写为dd/mm/yyyyyy。你让我有点困惑,因为你作为数据提供的值列与你想要的输出中的值列不一样。谢谢@antoniosK这段代码做我要找的。。对不起,这是我的类型。我刚刚在mutate_impl.data中遇到了一个错误,dots:无法将类型“closure”强制为类型“character”的向量。您能检查一下是否可以复制我的精确代码吗?使用read.table包含我的数据集。如果您可以这样做,并且错误是基于您的实际数据集,那么我们必须确保列类型相似。感谢您的时间,它工作正常,但在您的代码中,累积和在窗口3m后停止并重新启动,这不是我的目标。我明白了,目标是获得一个滚动窗口,每个IDOh的每次操作可返回3m。我会解决的。