Gibt es eine Möglichkeit, NA
s in einem zoo
oder xts
Objekt mit einer begrenzten Anzahl von s Forward füllen. Mit anderen Worten wie füllen NA
s bis zu 3 aufeinanderfolgende NA
s, und dann halten Sie die NA
s vom 4. Wert bis eine gültige Zahl.Fill NA in einer Zeitreihe nur zu einer begrenzten Anzahl
So etwas wie das.
library(zoo)
x <- zoo(1:20, Sys.Date() + 1:20)
x[c(2:4, 6:10, 13:18)] <- NA
x
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 NA NA NA 5 NA NA
2014-09-27 2014-09-28 2014-09-29 2014-09-30 2014-10-01 2014-10-02 2014-10-03
NA NA NA 11 12 NA NA
2014-10-04 2014-10-05 2014-10-06 2014-10-07 2014-10-08 2014-10-09
NA NA NA NA 19 20
gewünschte Ausgabe, wird etwas mit variabel sein n = 3 ist
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 1 1 1 5 5 5
2014-09-27 2014-09-28 2014-09-29 2014-09-30 2014-10-01 2014-10-02 2014-10-03
5 NA NA 11 12 12 12
2014-10-04 2014-10-05 2014-10-06 2014-10-07 2014-10-08 2014-10-09
12 NA NA NA 19 20
ich viele Kombination versucht haben, mit na.locf(x, maxgap = 3)
etc ohne viel Erfolg. Ich kann eine Schleife erstellen, um die gewünschte Ausgabe zu erhalten, ich habe mich gefragt, ob es eine vektorisierte Möglichkeit gibt, dies zu erreichen.
fillInTheBlanks <- function(v, n=3) {
result <- v
counter0 <- 1
for(i in 2:length(v)) {
value <- v[i]
if (is.na(value)) {
if (counter0 > n) {
result[i] <- v[i]
} else {
result[i] <- result[i-1]
counter0 <- counter0 + 1
} }
else {
result[i] <- v[i]
counter0 <- 1
}
}
return(result)
}
Dank
Hinzufügen einiger Anwendungsfall, wenn wir ein Vierteljährliches Daten haben und wir wissen, diese Daten sind gut für die nächsten 3 Monate, und können bis zu einem Maximum von weiteren 3 weiteren Monaten sein, aber alles, was über das akzeptable Limit hinausgeht, sollte die Daten wirklich zu NA machen und sie nicht bis zur Unendlichkeit der Szenarien ausfüllen. –