2016-12-21 15 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