在向量内传播数据

时间:2009-11-23 11:57:33

标签: 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

我制作了这个......但我怀疑还有更多的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)
}

5 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分: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]
}

答案 2 :(得分:2)

只是为了好玩(因为它比fillInTheBlanks慢),这里的na.locf版本依赖于rle功能:

my.na.locf <- function(v,fromLast=F){
  if(fromLast){
    return(rev(my.na.locf(rev(v))))
  }
  nas <- is.na(v)
  e <- rle(nas)
  v[nas] <- rep.int(c(NA,v[head(cumsum(e$lengths),-1)]),e$lengths)[nas]
  return(v)
}

e.g。

v1 <- c(3,NA,NA,NA,1,2,NA,NA,5)
v2 <- c(NA,NA,NA,1,7,NA,NA,5,NA)

my.na.locf(v1)
#[1] 3 3 3 3 1 2 2 2 5

my.na.locf(v2)
#[1] NA NA NA  1  7  7  7  5  5

my.na.locf(v1,fromLast=T)
#[1] 3 1 1 1 1 2 5 5 5

my.na.locf(v2,fromLast=T)
#[1]  1  1  1  1  7  5  5  5 NA

答案 3 :(得分:0)

另一个简单的答案。这个照顾第一个值是NA。这是一个死胡同,所以我的循环统计数据来自索引2.

my_vec <- c(1, NA, NA, 2, 3, NA, 4)
fill.it <- function(vector){
  new_vec <- vector
  for (i in 2:length(new_vec)){
    if(is.na(new_vec[i])) {
      new_vec[i] <- new_vec[i-1]
    } else {
      next
    }
  } 
  return(new_vec)
}

答案 4 :(得分:0)

多个R程序包都包含一个na.locf函数,它正是这样做的。 (imputeTS,动物园,时空等等)

以下是imputeTS的示例:

library("imputeTS")    
x <- c(1, NA, NA, 2, 3, NA, 4)
na.locf(x)

imputeTS 软件包还提供了更高级的方法来替换缺失值。 (还有动物园)