R 在向量中传播数据

R 在向量中传播数据,r,vector,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 我制作了这个。。。但我怀疑有一种更为简单的方法可以做到这一点 fillInTheBlanks <- function(v) { ## replace each NA with the latest pre

我在学习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
我制作了这个。。。但我怀疑有一种更为简单的方法可以做到这一点

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

FillingblanksPackage
zoo
有一个函数
na.locf()

na.locf
:最后一次观察结转; 用于将每个“NA”替换为之前的最新非“NA”的通用函数


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

我正在从zoo库进行一些最小的复制和粘贴(再次感谢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]
}
FillingBlanks只是为了好玩(因为它比
FillingBlanks
慢),这里有一个版本的
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)
}

my.na.locf另一个简单的答案。这一个处理第一个值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)
}

my_vec多个R包都包含了一个na.locf函数,它正是这样做的。(输入、动物园、时空等)

以下是一个使用输入的示例:

library("imputeTS")    
x <- c(1, NA, NA, 2, 3, NA, 4)
na.locf(x)
库(“输入项”)

x及其fromLast参数解决了对称问题!(我现在正在读na.locf.R的代码,里面有很多值得一读的东西)有趣的源代码。我在添加另一个答案,从你和动物园图书馆中提炼而来。
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)
}
library("imputeTS")    
x <- c(1, NA, NA, 2, 3, NA, 4)
na.locf(x)