Pregunta

Given a vector such as (say) c(2,NA,5,NA,NA,1,NA) the problem is to "last observation carry forward" resulting in vector c(2,2,5,5,5,1,1).

As answered here, na.locf from the zoo package can do this. However, given the simplicity of the problem, and the fact that this is to be performed many times from a "blank" R environment, I would like to do this without loading packages. Is there a way to do it simply and quickly using just basic R? (The vector may be long and may contain many consecutive NAs.)

¿Fue útil?

Solución

Extracted from zoo::na.locf.default

fillInTheBlanks <- function(S) {
  L <- !is.na(S)
  c(S[L][1], S[L])[cumsum(L)+1]
}

See also here.

Otros consejos

This is one way using rle:

x <- c(2,NA,5,NA,NA,1,NA) 
x[is.na(x)] <- Inf
x[is.infinite(x)] <- with(rle(x), 
    rep(values[which(is.infinite(values)) - 1], lengths[is.infinite(values)])
)
# [1] 2 2 5 5 5 1 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top