R 将连续NAs减少为单个NA的最佳方法

R 将连续NAs减少为单个NA的最佳方法,r,R,我需要将向量中的连续NA减少为单个NA,而不接触其他值。 例如,给定这样一个向量: NA NA 8 7 NA NA NA NA NA 3 3 NA -1 4 我需要得到的是以下结果: NA 8 7 NA 3 3 NA -1 4 目前,我正在使用以下功能: reduceConsecutiveNA2One <- function(vect){ enc <- rle(is.na(vect)) # helper func tmpFun <- fun

我需要将向量中的连续NA减少为单个NA,而不接触其他值。
例如,给定这样一个向量:

NA NA  8  7 NA NA NA NA NA  3  3 NA -1  4
我需要得到的是以下结果:

NA  8  7 NA  3  3 NA -1  4
目前,我正在使用以下功能:

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

reduceConsecutiveNA2One也许这会有用

x <- c(NA, NA,8,7,NA, NA, NA, NA, NA, 3, 3, NA, -1,  4)
c(x[rowSums(is.na(embed(x,2)))!=2], x[length(x)])
[1] NA  8  7 NA  3  3 NA -1  4
xy
[1] NA NA 8 7 NA NA NA 3 NA-1 4 NA NA 3
>myfun(y)
[1] NA 8 7 NA 3 3 NA-1 4 NA 3
>myfun(北美)
[1] NA
>我的乐趣(1)
[1] 1
这里有一个想法:

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

x没有其他回答那么酷,但是使用
rle的方法不同:

x <- c(NA, NA,  8,  7, NA, NA, NA, NA, NA,  3,  3, NA, -1,  4)
x[is.na(x)] <- 999
y <- rle(x)
y[[1]][y[[2]]==999] <- 1
y[[2]][y[[2]]==999] <- NA
rep(y[[2]], y[[1]])

#per Dason's Suggestion:
inverse.rle(y)

因此,需要使用
头部
尾部
重新编码到999

这是一个有趣的小练习:

merge.na <- function(x) c(head(x, 1), tail(x, -1)[!(is.na(tail(x, -1)) &
                                                    is.na(head(x, -1)))])

merge.na娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。它只需要检查向量是否只有一个元素(因为它崩溃)。@digEmAll
myfun
现在检查
length
,它现在可以处理长度为1的向量。是的,不幸的是,rle不重新编码NAs(如果这样做会更容易)。问题是,我不能考虑任何范围之外的值(不是999,不是99999等等…),用它代替NAs。Svin不确定你的评论是针对我的解决方案还是<代码> RLE < /代码>和<代码> No>代码>东西。正如我提供的示例所示,我的解决方案使用连续整数。但遗憾的是,它无法满足迪德马尔的需求。我的意思是,您可以通过添加字符值将其转换为字符,然后替换并转换回,但这已经不是一个很酷的解决方案:)不要忘记
inverse.rle
。基本上,它只做最后一行代码中的事情,但更安全一点。@Dason忘记了吗?我从来不知道这件事。我添加它是为了展示它的用途。它甚至可以稍微短一点:
x[!is.na(x)| diff(c(FALSE,is.na(x))]
这也非常优雅和聪明!谢谢:)
> rle(x)
Run Length Encoding
  lengths: int [1:13] 1 1 1 1 1 1 1 1 1 2 ...
  values : num [1:13] NA NA 8 7 NA NA NA NA NA 3 ...
merge.na <- function(x) c(head(x, 1), tail(x, -1)[!(is.na(tail(x, -1)) &
                                                    is.na(head(x, -1)))])