R:非标准 window 的滚动总和
R: Rolling sum on a non standard window
我有一个不规则的时间序列,我正在尝试用 R 计算 3 个月 window 与 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 个月 windows,因为您想从数据集中的每个日期返回 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
我有一个不规则的时间序列,我正在尝试用 R 计算 3 个月 window 与 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 个月 windows,因为您想从数据集中的每个日期返回 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