在布尔向量中找到*第一个*最长的 TRUE 序列

sym*_*ush 8 r

我需要在布尔向量中找到第一个最长的 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)
Run Code Online (Sandbox Code Playgroud)

除了上述示例中的第一个之外,此处的答案处理我的所有案例都是正确的。


我该如何改变

with(rle(bool), rep(lengths == max(lengths[values]) & values, lengths))
Run Code Online (Sandbox Code Playgroud)

以便它也处理上面的第一个示例是否正确?

tmf*_*mnk 7

一种选择可能是:

with(rle(bool), rep(seq_along(values) == which.max(lengths * values), lengths))
Run Code Online (Sandbox Code Playgroud)

第一个向量的结果:

[1] FALSE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

对于第二个:

[1] FALSE FALSE FALSE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

对于第三个:

[1] FALSE  TRUE  TRUE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)


GKi*_*GKi 5

不优雅,但可能有效:

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
Run Code Online (Sandbox Code Playgroud)

并作为一个功能:

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)
Run Code Online (Sandbox Code Playgroud)