2016-12-21 50 views
0

我已經錄了幾時間間隔爲以下幾點:填寫丟失的時間序列區間

In   Out   tag  
    2008-12-18 2008-12-19 1 
    2008-12-22 2008-12-23 1 
    2008-12-29 2009-01-02 1 
    2009-01-05 2009-01-05 1 
    2009-01-13 2009-01-13 1 
    2009-01-14 2009-01-14 1 
    2009-01-19 2009-01-19 1 

我想補客棧丟失的時間間隔,所以它看起來是這樣的:

In   Out   tag  
    2008-12-18 2008-12-19 1 
    2008-12-20 2008-12-21 0 
    2008-12-22 2008-12-23 1 
    2008-12-24 2008-12-28 0 
    2008-12-29 2009-01-02 1 
    2009-01-03 2008-01-04 0 
    2009-01-05 2009-01-05 1 
    ... 

我知道我可以使用zoo填寫時間序列的缺失日期。另外,我可以從lubridate包中創建interval(start, end)的間隔。我最初的想法是,我可以將它結合起來填寫缺失的時間間隔。

我也一直在思考是否有「香檳力」的方法,我可以用它來填補間隔。例如,可以從上一行獲得最後一個項目Out並且從下一行獲得In的函數,但是沒有設法找到任何解決方案。

理想情況下,我想知道是否有任何聰明的方法使用zoo,lubridate, xtsxts或R中的其他工具?

+0

在「IN」和「出」的天差不遵循任何模式或有任何模式?例如,在第四行中,In和Out都在'2009-01-05'中。那麼,我們如何才能知道下一個起點是什麼以及'In'和'Out'之間的差異是單日還是同一天呢? – akrun

+0

第二行的第4行是24-28。爲什麼不是24-25,26-27 ......? – Sotos

+0

缺少什麼間隔沒有模式。 – Hav

回答

0

試試這個:

library(data.table) 

df = data.table(
    In=as.Date('2008-12-18') + cumsum(c(0,4,7,7,8,1,5)), 
    Out=as.Date('2008-12-19') + cumsum(c(0,4,10,3,8,1,5)), 
    tag=1) 

toMerge = df[, .(In=Out+1, Out=shift(In-1, type='lead'), tag=0)][In <= Out] 

> merge(df, toMerge, all=T) 
#   In  Out tag 
# 1: 2008-12-18 2008-12-19 1 
# 2: 2008-12-20 2008-12-21 0 
# 3: 2008-12-22 2008-12-23 1 
# 4: 2008-12-24 2008-12-28 0 
# 5: 2008-12-29 2009-01-02 1 
# 6: 2009-01-03 2009-01-04 0 
# ... 
+0

沒有合併工作,但使用了rbind。很好的data.table解決方案,它很容易包含一個聲明。 – Hav