假设我们有一个具有缺失值的值向量,如下所示:
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)
有什么想法吗?
谢谢
答案 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