首页 > 解决方案 > 根据周围的值替换 NA

问题描述

假设我有一个充满NAs 的向量,除了每 5 个值,它可能是两个级别之一:

RNGkind('Mersenne-Twister')
set.seed(42)

x <- NULL
for(i in 1:1000){
  x <- c(x,c(sample(c('Hey', 'Hullo'), 1, rep = F), rep(NA, 4)))
}
x

我想NA根据周围的情况填充 s:

"Hullo" NA NA NA NA "Hey": NAs become "Hey" 
"Hullo" NA NA NA NA "Hullo" NAs become "Hullo"
"Hey" NA NA NA NA "Hullo": NAs become "Hullo"
"Hey" NA NA NA NA "Hey": NAs become "Hey"

我想出了一个for循环,它迭代地查看每个元素并NA根据大量if语句填充 s:

for(i in 1:length(x)){
  if(!is.na(x[i])){
     next
   }else{
    if(x[i-1] == 'Hullo' & x[i+4] == 'Hullo' | x[i-1] == 'Hey' & x[i+4] == 'Hullo'){
      x[i:(i+3)] <- 'Hullo'
    }else{
      x[i:(i+3)] <- 'Hey'
    }
  }
}

但这有点笨拙,也不处理向量的尾部,那里可能有一个NA. 理想情况下,最后一组NA将匹配最后一组的输出。

如果它更容易,那么NA在两个非 s 之间总会有四个NAs。

有没有:

  1. 更优雅/更快的方式来做到这一点?
  2. 一种无需手动填充向量末尾的方法?

编辑:添加了最后一组NAs 并确认非NAs 总是以一致的时间间隔出现(每 5 个元素)

标签: rfor-loopif-statementvectorna

解决方案


这是使用tidyr包的解决方案:

xres <- tidyr::fill(data = data.frame(x, stringsAsFactors = FALSE), x, .direction = "up")
xres <- tidyr::fill(data = xres, x, .direction = "down")
xres$x

首先你填写一个方向,然后填写另一个方向以获得最后的值


推荐阅读