Czy istnieje sposób na wypełnienie NA
s w obiekcie zoo
lub xts
z ograniczoną liczbą następujących po sobie NA
s. Innymi słowy, np. Wypełnij NA
s aż do 3 kolejnych NA
s, a następnie zachowaj NA
s od czwartej wartości, aż do poprawnej liczby.Wypełnij NA w szeregu czasowym tylko do ograniczonej liczby
Coś takiego.
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
pożądany wynik, będzie coś ze zmienną n = 3 jest
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
Próbowałem wiele kombinacji z na.locf(x, maxgap = 3)
etc bez większego sukcesu. Potrafię stworzyć pętlę, aby uzyskać pożądany wynik, zastanawiałem się, czy istnieje wektoryzowany sposób osiągnięcia tego.
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)
}
Dzięki
Dodanie kilku scenariuszy przypadków użycia, gdy mamy qtrly danych i wiemy dane te są dobre przez następne 3 miesiące i mogą wynosić maksymalnie kolejne 3 miesiące, ale wszystko poza dopuszczalnym limitem powinno sprawić, że dane rzeczywiście będą NA i nie powinny wypełniać ich aż do nieskończonych scenariuszy. –