如果你想要三个连续的 1,或者如果你想要至少三个连续的 1,这里是一个使用基本 R 解决方案的函数,它利用 cumsum()(和 diff()。这只是偏移了 cumsum 向量来比较 if有n 连续的。现在它被设计用于逻辑向量或0/1 向量。而且,如果你有"at least" 作为类型,它将选择第一个匹配,但很容易适应选择最后一个如果你愿意的话。
consecutive_n <- function(vector, n, type = c("equal", "at least")) {
length_vec <- length(vector)
cumsum_vec <- cumsum(vector)
difference <- cumsum_vec - c(rep(0, n), cumsum(vector)[-c((length_vec-n+1):length_vec)]) == n
type <- match.arg(type)
if(type == "equal") {
difference & c(0, diff(difference)) == 1
} else {
difference
}
}
consecutive_n(x, 3)
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
sum(consecutive_n(x, 3))
[1] 4
which(consecutive_n(x, 3))
[1] 5 10 14 21
sum(consecutive_n(x, 3, type = "at least"))
[1] 7
which(consecutive_n(x, 3, type = "at least"))
[1] 5 6 10 14 15 16 21
数据:
x <- c(1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0)