Найдите самый длинный непрерывный фрагмент TRUE в булевом векторе

С учетом булева вектора, как я могу найти самый длинный непрерывный кусок TRUE и изменить остальные значения TRUE на FALSE?

Например, при заданном булевом векторе:

bool = c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)

Как я могу получить вектор:

c(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)

Ответ 1

Здесь используется подход, который будет выделять все длинные фрагменты последовательного TRUE в булевом векторе. Это означает, что, если есть, скажем, два фрагмента TRUE одной и той же (макс.) Длины, оба будут отображаться как TRUE в выводе.

Мы можем использовать:

with(rle(bool), rep(lengths == max(lengths[values]) & values, lengths))

что означает:

  • with(rle(bool), ...): вычислить длины выполнения
  • lengths == max(lengths[values]) & values: проверьте, равна ли каждая длина выполнения максимальной длине выполнения, где значения TRUE, а также проверьте, действительно ли значения TRUE
  • rep(...., lengths): повторяйте каждую из полученных логических систем так же часто, как собственная длина выполнения

Контрольный пример OP:

bool <- c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)
with(rle(bool), rep(lengths == max(lengths[values]) & values, lengths))
# [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE

Второй тестовый пример: те же самые максимумы для T и F:

x <- c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE)
with(rle(x), rep(lengths == max(lengths[values]) & values, lengths))
# [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Третий тестовый пример: F длиннее, чем T:

y <- c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
with(rle(y), rep(lengths == max(lengths[values]) & values, lengths))
# [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Ответ 2

Использование rle:

myRle <- rle(bool)$length
rep(myRle == max(myRle), myRle)

OP не предоставил ответы на возможные проблемы с этим подходом, но полный ответ предложен docendodiscimus должен охватывать все возможные проблемы.

Ответ 3

С вдохновением от @zx8754

Это должно работать, даже если самая длинная общая последовательность выполнена из FALSE.

runs <- rle(bool)
lengths <- runs$lengths

is_max <- which(lengths == max(lengths[runs$values]) & runs$values)
rep(1:length(lengths) == is_max[1], lengths)