4
votes

Comment puis-je utiliser maxgap avec na.fill sur un zoo ou xts?

Je voudrais remplir les NA avec 0 dans un xts avec un maxgap de 3.

library(xts)

# make sample xts with gaps
x <- zoo(1:20, Sys.Date() + 1:20) 
x[2:4] <- NA # Short run of NA's 
x[10:16] <- NA # Long run of NA's 

#This is what I want to do, but it does not work
na.fill(x, 0, maxgap=3)

L'argument maxgap est ignoré et tous les NA sont remplis avec 0, j'espérais que cela fonctionnerait comme na.approx

Clarification pour répondre à la question de @RLave , je souhaite remplacer chaque série de NA de longueur 3 ou moins. Les séries de NA de longueur 4 ou plus doivent rester inchangées. Le comportement souhaité doit être le même que celui de na.approx


0 commentaires

3 Réponses :


1
votes

Je ne suis pas très familier avec zoo , je ne peux donc pas dire s'il fournit une fonction ou un argument qui le fera pour vous dès le départ. Cela dit, en tirant parti de l'argument ix de na.fill , vous pouvez écrire une simple fonction wrapper qui fournit la fonctionnalité souhaitée. Peut-être quelque chose comme ceci:

f <- function(object, fill = 0, maxgap = Inf, ...) {
    rr <- rle(is.na(object))
    ii <- rep(rr$values == FALSE | rr$lengths > maxgap, rr$lengths)
    na.fill(object, fill, ix = ii)
}

f(x, 0, maxgap = 3)
## 2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23 
##          1          0          0          0          5          6          7 
## 2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30 
##          8          9         NA         NA         NA         NA         NA 
## 2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05 
##         NA         NA         17         18         19         20 


1 commentaires

@RLave Comme il le fait dans na.approx () , l'OP souhaite que maxgap spécifie la plus longue séquence contiguë de valeurs NA qui sera rempli. Les séquences de NA plus longues que maxgap doivent être laissées seules, inchangées. Cela a-t-il du sens?



3
votes

Il y a un .fill_short_gaps non documenté et non exporté dans le zoo qui est utilisé comme ceci:

2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23 
         1          0          0          0          5          6          7 
2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30 
         8          9         NA         NA         NA         NA         NA 
2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05 
        NA         NA         17         18         19         20 

donnant:

zoo:::.fill_short_gaps(x, fill = numeric(length(x)), maxgap = 3)


0 commentaires

0
votes

Il existe une méthode assez simple pour le faire avec le package imputeTS:

library("imputeTS")
na_replace(x, fill = 0 , maxgap = 3)

Cela fonctionne avec des objets de série temporelle xts comme entrée x, ainsi qu'avec des séries de zoo, des vecteurs ou du temps normal série.


0 commentaires