2017-03-25 6 views
3

Ich habe einen Datumsvektor mit führenden NAs und ich möchte eine ungefähre Sequenz für diese NAs mit na.approx aus Paket zoo generieren.Rückwärts/Rückwärtsna.approx

na.approx nicht für führende NAs arbeiten:

x <- as.Date(c(rep(NA,3),"1992-01-16","1992-04-16","1992-07-16", 
"1992-10-16","1993-01-15","1993-04-16","1993-07-17")) 
as.Date(na.approx(x,na.rm=FALSE)) 

[1] NA   NA   NA   "1992-01-16" "1992-04-16" 
1992-07-16" "1992-10-16" "1993-01-15" "1993-04-16" "1993-07-17" 

Ich dachte, dass ich meine Vektor rev mit umkehren könnte, aber ich NAs noch Irgendwelche Ideen

as.Date(na.approx(rev(x),na.rm=FALSE)) 

[1] "1993-07-17" "1993-04-16" "1993-01-15" "1992-10-16" "1992-07-16" 
"1992-04-16" "1992-01-16" NA   NA   NA 

bekommen?

+0

'as.Date (na.approx (x, na.rm = FALSE, Regel = 2))' wird ein bisschen näher, aber es scheint, wie Sie wollen es, um eine Sequenz außerhalb des Bereichs zu erstellen? Versuchen Sie 'as.Date (na.spline (x, na.rm = FALSE))' – user20650

+0

Nur Ihre Bearbeitung zu sehen. Poste deine 'na.spline' Antwort und ich akzeptiere sie. Vielen Dank. –

+0

keine probs .. bitte lösche deine Antwort zurück – user20650

Antwort

1

Gefunden meine Antwort. na.spline macht einen guten Job mit vielen Daten. Im obigen Beispiel habe ich wenige Daten, die eine Annäherung der Annäherung verursachen. In meinem realen Beispiel gibt es jedoch keine Drift.

as.Date(na.spline(x,na.rm=FALSE)) 
[1] "1993-07-17" "1993-04-16" "1993-01-15" "1992-10-16" "1992-07-16" 
"1992-04-16" "1992-01-16" "1991-10-15" "1991-07-13" "1991-04-06" 
+0

Ich denke 'na.spline' ist die Antwort, so sollte dies das tick (ps brauchen Sie nicht rev) – user20650

+1

Ich kann nicht meine eigene Antwort für 48 Stunden. Ich werde es so für jetzt verlassen, damit andere Benutzer wissen, dass die Frage beantwortet worden ist. –

2

na.approx erfordert eine rule außerhalb des min oder max Wert von Ihre Vektor für Werte übergeben werden. Wenn rule=2 verwendet wird, werden die fehlenden Werte mit dem nächstliegenden Wert berechnet.

as.Date(na.approx(x,na.rm=FALSE, rule=2)) 
# [1] "1992-01-16" "1992-01-16" "1992-01-16" "1992-01-16" "1992-04-16" "1992-07-16" "1992-10-16" "1993-01-15" 
# [9] "1993-04-16" "1993-07-17" 

Als Alternative können Sie na.spline (wie in Ihrer Antwort) verwenden. Sie erwähnen, dass es ein wenig wild bekommen kann, so dass Sie eine Funktion schreiben können, um die Werte basierend auf dem Zeitunterschied zwischen Ihren Kennzahlen zu unterstellen. Ich benutze den ersten nicht-fehlenden Unterschied hier

add_leading_seq_dates <- function(x) { 
     first_non_missing = which.min(is.na(x)) 
     first_day_diff = na.omit(diff(x))[1] 
     no_of_leadng_missing = first_non_missing - 1 
     input_dates = x[first_non_missing] - cumsum(rep(first_day_diff, no_of_leadng_missing)) 
     x[is.na(x)] = rev(input_dates) 
     x 
} 

add_leading_seq_dates(x) 

# [1] "1991-04-18" "1991-07-18" "1991-10-17" "1992-01-16" "1992-04-16" 
# [6] "1992-07-16" "1992-10-16" "1993-01-15" "1993-04-16" "1993-07-17" 

diff(add_leading_seq_dates(x)) 
# Time differences in days 
# [1] 91 91 91 91 91 92 91 91 92