Если вам нужно ровно три последовательных единицы или если вы хотите хотя бы три последовательных единицы, вот функция, использующая решение base R, которое использует cumsum()
(и diff()
. Это просто смещает вектор cumsum
для сравнения, если есть 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)