假设我们有一个具有缺失值的值向量,如下所示:
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)
有任何想法吗?
谢谢
您可以尝试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