当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何识别向量中一系列NA的索引》经验,为你挑选了1个好方法。

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

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> Cath..:

您可以尝试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 ...

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

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


谢谢@Frank:是的,我的意思是那个,但是我用一种不太好的方式"说"它(当你评论时我正在编辑);-)
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有