问题
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.)
回答1:
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.
回答2:
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
来源:https://stackoverflow.com/questions/19838735/how-to-na-locf-in-r-without-using-additional-packages