在布尔向量中找到最长的连续TRUE块

时间:2016-05-25 20:33:36

标签: r boolean

给定布尔向量,如何找到TRUE的最长连续块并将其余TRUE值更改为FALSE

例如,给定一个布尔矢量:

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

我怎样才能得到像这样的矢量:

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

3 个答案:

答案 0 :(得分:14)

使用rle:

myRle <- rle(bool)$length
rep(myRle == max(myRle), myRle)
OP未提供此方法可能出现的问题的答案,但docendodiscimus提出的完整答案应涵盖所有可能的问题。

答案 1 :(得分:11)

这是一种突出显示布尔向量中连续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

第三个测试用例:比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 :(得分:1)

灵感来自@ 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)