将连续NA减少到单个NA的最佳方法

dig*_*All 11 r

我需要将矢量中的连续NA减少到单个NA,而不触及其他值.
所以,例如,给定一个这样的向量:

NA NA  8  7 NA NA NA NA NA  3  3 NA -1  4
Run Code Online (Sandbox Code Playgroud)

我需要得到的是以下结果:

NA  8  7 NA  3  3 NA -1  4
Run Code Online (Sandbox Code Playgroud)

目前,我正在使用以下功能:

reduceConsecutiveNA2One <- function(vect){
  enc <- rle(is.na(vect))

  # helper func
  tmpFun <- function(i){
    if(enc$values[i]){
      data.frame(L=c(enc$lengths[i]-1, 1), V=c(TRUE,FALSE))
    }else{
      data.frame(L=enc$lengths[i], V=enc$values[i])
    }
  }

  Df <- do.call(rbind.data.frame,lapply(1:length(enc$lengths),FUN=tmpFun))

  return(vect[rep.int(!Df$V,Df$L)])
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但可能有一个更简单/更快的方法来完成这项任务.

有什么建议 ?

提前致谢.

Jos*_*ien 13

这是一个想法:

x <- c(NA, NA,8,7,NA, NA, NA, NA, NA, 3, 3, NA, -1,  4)

x[!(is.na(x) & diff(c(FALSE, is.na(x)))==0)]
# [1] NA  8  7 NA  3  3 NA -1  4

## It also works for length-one vectors
x <- NA
x[!(is.na(x) & diff(c(FALSE, is.na(x)))==0)]
# [1] NA
Run Code Online (Sandbox Code Playgroud)