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