Найти * первую * самую длинную последовательность TRUE в булевом векторе - PullRequest
8 голосов
/ 22 апреля 2020

Мне нужно найти самую длинную последовательность first TRUE в булевом векторе. Некоторые примеры:

bool <- c(FALSE, TRUE, FALSE, TRUE)
# should become
c(FALSE, TRUE, FALSE, FALSE)

bool <- c(FALSE, TRUE, FALSE, TRUE, TRUE)
# should become
c(FALSE, FALSE, FALSE, TRUE, TRUE)

bool <- c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE)
# should become
c(FALSE, TRUE, TRUE, FALSE, FALSE, FALSE)

Ответ от здесь обрабатывает все мои дела правильно, кроме первого из приведенных выше примеров.


Как я могу изменить

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

, чтобы он также правильно обрабатывал первый пример, приведенный выше?

Ответы [ 2 ]

7 голосов
/ 22 апреля 2020

Один из вариантов может быть:

with(rle(bool), rep(seq_along(values) == which.max(lengths * values), lengths))

Результаты для первого вектора:

[1] FALSE  TRUE FALSE FALSE

Для второго:

[1] FALSE FALSE FALSE  TRUE  TRUE

Для третьего:

[1] FALSE  TRUE  TRUE FALSE FALSE FALSE
5 голосов
/ 22 апреля 2020

Не элегантно, но может работать:

bool <- c(FALSE, TRUE, FALSE, TRUE)

tt <- rle(bool)
t1 <- which.max(tt$lengths[tt$values])
tt$values[tt$values][-t1] <- FALSE
inverse.rle(tt)
#[1] FALSE  TRUE FALSE FALSE

и как функция:

fun <- function(bool) {
  tt <- rle(bool)
  t1 <- which.max(tt$lengths[tt$values])
  tt$values[tt$values][-t1] <- FALSE
  inverse.rle(tt)
}
fun(c(FALSE, TRUE, FALSE, TRUE))
#[1] FALSE  TRUE FALSE FALSE

fun(c(FALSE, TRUE, FALSE, TRUE, TRUE))
#[1] FALSE FALSE FALSE  TRUE  TRUE

fun(c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE))
#[1] FALSE  TRUE  TRUE FALSE FALSE FALSE

fun(FALSE)
#[1] FALSE

fun(logical(0))
#logical(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...