我有一个向量,像这样:
test = c(NA, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, 1, 1, 1, 1, NA, NA, 1)
在这个向量中,我想第一次确定15个值中的12个等于1。
我已经开始使用rle
来计算连续值:
#get counts of sequences
count = rle(test)
然后得到一个基于此的序列:
#make a sequence of the counts
new <- sequence(count$lengths)
然后,我将把new
中的任何值变为0,其中test
值等于NA:
#when the value was na make the count 0
new[is.na(test)] <- 0
最后,我将所有其他值更改为1:
#make all other counts 1
new[new !=0] <- 1
将返回:
[1] 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1
这就是我陷入困境的地方,现在我知道15个值中第一次有12个值为1的索引位置是idx=6,但我陷入了如何用算法检索它的困境。
我们可以使用zoo::rollsum
来找到下一个15个值的总和为12或更多的第一个点。
which(zoo::rollsum(test, 15, align = "left", fill = 0) >= 12)[1]
#> [1] 6
由reprex包于2020-07-17创建(v0.3.0(
我们可以用rollapply
来做逻辑向量的sum
,并用match
得到和为12的第一个匹配的索引
library(zoo)
match(12, rollapply(test, width = 15, FUN = function(x) sum(x== 1, na.rm = TRUE)))
#[1] 6