2017-07-28 68 views
0

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

数据结构如下

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个月的滚动金额?

+0

我已经看过rollmean功能,但它有一个标准窗口 – Tyu1990

+0

日期是写成月/日/年还是日期/月/年? – akash87

+0

日期写成dd/mm/yyyy – Tyu1990

回答

1

由于您想要从数据集中的每个日期起返回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 
+0

您让我感到困惑了一些,因为您提供的数据值与您希望的输出不同。 – AntoniosK

+0

感谢@antoniosK此代码做我在找什么..抱歉的类型。 我只是一个错误 错误mutate_impl(。数据,点): 不能强迫式“封闭”到 – Tyu1990

+0

你可以检查您是否可以复制我的确切码型“性格”的载体? (包括我的数据集使用'read.table')。如果你能做到这一点,错误是基于你的实际数据集,那么我们必须确保列类型是相似的。 – AntoniosK