Вопрос

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.)

Это было полезно?

Решение

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.

Другие советы

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top