计算R中连续TRUE值的数量

时间:2016-11-28 21:41:17

标签: r boolean

我想计算在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

它将计数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

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

3 个答案:

答案 0 :(得分:9)

这应该有效:

with(rle(x), sum(lengths[values] >= 2))

<强>解释

当您使用布尔时,您可以从中获利。 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

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

rle(x)$values
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE

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

rle(x)$lengths[rle(x)$values]
[1] 1 3 1 1 2

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

with(rle(x), sum(lengths[values] >= 2))
[1] 2

答案 1 :(得分:1)

您还可以将display: none$('.comments')用于此目的,如下所示:

cumsum

答案 2 :(得分:-1)

以下是来自rleid的{​​{1}}的另一个选项。 data.table为不同的相邻元素提供唯一ID,与x相乘,将原始向量中与rleid对应的元素转换为0,获得FALSE转换的频率到逻辑向量(tabulate)并获取==2

sum