如何识别向量中一系列NA的索引

时间:2015-12-15 15:20:38

标签: r

假设我们有一个具有缺失值的值向量,如下所示:

test <- c(3,6,NA,7,8,NA,NA,5,8,6,NA,4,3,NA,NA,NA)

目标是识别长度为2或更小的NA系列,以便对在其末端具有非NA值的系列应用线性插值。我能够使用以下代码检测此类序列结尾的索引:

which.na <- which(is.na(test))

diff.which.na <- diff(which.na)

which.diff.which.na <- which(diff.which.na>1)

end.index <- which.na[which.diff.which.na]

结果:

> end.index
[1]  3  7 11

可以使用条件语句处理最后一个NA系列。但是我无法找到NA系列开头的索引,因为我无法执行以下操作:

diff.which.na <- diff(which.na,lag=-1)

所以预期的输出是:

beg.index= c(3,6,11)

end.index=c(3,7,11)

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:9)

您可以尝试rle

seq_na <- rle(is.na(test))
seq_na
#Run Length Encoding
#  lengths: int [1:8] 2 1 2 2 3 1 2 3
#  values : logi [1:8] FALSE TRUE FALSE TRUE FALSE TRUE ...

查找长度至少为2的TRUE序列:

seq_na$lengths[seq_na$values]
# [1] 1 2 1 3 # there are 2 of them

要查找索引,您可以使用cumsum(感谢@Frank的改进!):

end.index <- with(seq_na, cumsum(lengths)[lengths <= 2 & values])
#[1]  3  7 11

beg.index <- end.index - with(seq_na, +(lengths==2 & values)[lengths <= 2 & values])
#[1]  3  6 11