2016-12-21 5 views
0

ich mehrere Zeitintervalle haben wie die folgende aufgezeichnet:Füllen Sie Zeitreihenintervalle fehlt

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 

Ich möchte inn die fehlenden Intervalle füllen, so dass es wie folgt aussieht:

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 
    ... 

Ich weiß, dass ich zoo verwenden kann, um fehlende Daten einer Zeitreihe auszufüllen. Auch dass ich mit interval(start, end) aus dem lubridate Paket Intervalle erstellen konnte. Mein Anfang war, dass ich das irgendwie kombinieren konnte, um die fehlenden Intervalle auszufüllen.

Ich habe auch darüber nachgedacht, ob es irgendwelche "brut-force" -Methoden gibt, mit denen ich die Intervalle füllen könnte. z. B. Funktion, die das letzte Element von Out in der vorherigen Zeile und In von der nächsten Zeile abrufen würde, aber keine Lösung gefunden haben.

Idealerweise würde ich gerne wissen, ob es irgendwelche clevere Möglichkeiten sind diese zoo, lubridate, xts oder andere Werkzeuge in R mit zu tun?

+0

Die Tage Unterschied in 'In' und 'Out' wird wie folgt keine Muster oder gibt es irgendwelche Muster? In der vierten Zeile befinden sich beispielsweise "In" und "Out" in "2009-01-05". Also, wie wissen wir, was der nächste Startpunkt sein wird und ob der Unterschied zwischen "In" und "Out" ein Tag oder ein Tag ist? – akrun

+0

Reihe 4 von Ihrem 2. df ist 24 - 28. Warum nicht 24-25, 26-27 ...? – Sotos

+0

In welchen Intervallen fehlen Muster. – Hav

Antwort

0

Try this:

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

Die Zusammenführung konnte nicht ausgeführt werden, aber rbind verwendet. Großartig mit der data.table-Lösung, bei der es einfach ist, eine By-Anweisung einzufügen. – Hav