计算R中连续TRUE值的数量

Cin*_*poo 1 boolean r

我想计算在R中看到两个连续的TRUE值的次数.例如,

x <- c(T,F,T,T,F,F,T,F,T,F)
x
 [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

它将计数1,因为在位置3处为TRUE,在位置4处为TRUE.如果有超过2个连续的TRUE,那么我只想计算它一次,即此向量

x <- c(T,F,T,T,T,F,T,F,T,F)
x
 [1]  TRUE FALSE  TRUE  TRUE TRUE FALSE  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

仍然会计数1.我开始看着rle()但是我卡住了.任何帮助将不胜感激.谢谢!

Car*_*ans 9

这应该工作:

with(rle(x), sum(lengths[values] >= 2))
Run Code Online (Sandbox Code Playgroud)

说明:

当您使用布尔值时,您可以从中获利.rle(x)$lengths将返回向量中连续多少次TRUEFALSE发生的次数.例

x <- c(T,F,T,T,T,F,T,F,T,F,T,T)
rle(x)$lengths
[1] 1 1 3 1 1 1 1 1 2
Run Code Online (Sandbox Code Playgroud)

现在,您只需要此向量中与TRUEs 对应的值.rle(x)$values返回具有外观顺序的向量.例:

rle(x)$values
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

您可以使用它来仅获取向量中的TRUEs lengths:

rle(x)$lengths[rle(x)$values]
[1] 1 3 1 1 2
Run Code Online (Sandbox Code Playgroud)

最后一步应该是显而易见的:计算这些值中有多少更重要或等于2.所有这些一起(性能改进):

with(rle(x), sum(lengths[values] >= 2))
[1] 2
Run Code Online (Sandbox Code Playgroud)