给定布尔向量,如何找到TRUE
的最长连续块并将其余TRUE
值更改为FALSE
?
例如,给定一个布尔矢量:
bool = c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)
我怎样才能得到像这样的矢量:
c(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)
答案 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)