我需要在布尔向量中找到第一个最长的 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)
以便它也处理上面的第一个示例是否正确?
一种选择可能是:
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)
不优雅,但可能有效:
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)