Last Observation Copied Forward

Si vous travaillez sur des séries temporelles, il y a une chose que vous avez toujours voulu faire : remplacer les données manquantes — i.e. les NA — par la dernière observation connue. C’est l’idée de la fonction locf pour Last Observation Copied Forward.

C’est-à-dire que qui vous avez :

> x <- c(1:3, NA, 5:6)
> x

[1] 1 2 3 NA 5 6

Vous voulez :

> locf(x)
[1] 1 2 3 3 5 6

La version la plus courte (et performante!) que j'ai trouvé s'écrit en une ligne :

x[c(NA, which(!is.na(x)))[cumsum( !is.na(x) ) + 1]]

Encapsulée dans une fonction récursive qui traite les matrice par colonnes, ça donne :

locf = function(x) {
        if( is.matrix(x) ) {
                res <- apply(x, 2, locf)
                dimnames(res) <- dimnames(x)
        } else {
                res <- x[c(NA, which(!is.na(x)))[cumsum( !is.na(x) ) + 1]]
                names(res) <- names(x)
        }
        return(res)
}

Aucun commentaire:

Enregistrer un commentaire