在向量内传播数据

mar*_*omo 10 r vector

我正在学习R,我很好奇......我需要一个能够做到这一点的功能:

> fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4))
[1] 1 1 1 2 3 3 4
> fillInTheBlanks(c(1, 2, 3, 4))
[1] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

我制作了这个......但我怀疑还有更多的R方法可以做到这一点.

fillInTheBlanks <- function(v) {
  ## replace each NA with the latest preceding available value

  orig <- v
  result <- v
  for(i in 1:length(v)) {
    value <- v[i]
    if (!is.na(value))
      result[i:length(v)] <- value
  }
  return(result)
}
Run Code Online (Sandbox Code Playgroud)

rcs*_*rcs 14

套餐zoo有一个功能na.locf():

R> library("zoo")
R> na.locf(c(1, 2, 3, 4))
[1] 1 2 3 4
R> na.locf(c(1, NA, NA, 2, 3, NA, 4))
[1] 1 1 1 2 3 3 4
Run Code Online (Sandbox Code Playgroud)

na.locf:最后的观察结果; 用于在每个'NA'之前替换最近的非'NA'的通用函数.

查看函数的源代码na.locf.default,它不需要for-loop.


mar*_*omo 13

我正在从动物园图书馆做一些最小的复制和粘贴(再次感谢rcs指点我)这就是我真正需要的:

fillInTheBlanks <- function(S) {
  ## NA in S are replaced with observed values

  ## accepts a vector possibly holding NA values and returns a vector
  ## where all observed values are carried forward and the first is
  ## also carried backward.  cfr na.locf from zoo library.
  L <- !is.na(S)
  c(S[L][1], S[L])[cumsum(L)+1]
}
Run Code Online (Sandbox Code Playgroud)