2017-07-28 49 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