Ответ 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