计算两个逻辑向量中第一个中每 运行 个 1 的交集

Counting intersections per run of 1s in the first of two logical vectors

已回答此问题的更一般版本 。一位用户建议我将这个更具体的问题版本作为一个单独的 post.

我有两个逻辑向量,如下所示:

x = c(0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) 
y = c(0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0)

我想计算连续值范围(在本例中为 1111)之间的交集,第一个向量中每 运行 个 1 最多计算一个交集。

使用上述答案中的sum(rle(x & y)$values),我可以将上述向量的交集总数计算为两个,但我期望一个.

是否希望交集的最大长度为1,如果是,可以

sum(with(rle(x & y), lengths == 1 & values))
#[1] 1

当我们执行 x & y 时,xy 的数值更改为逻辑值,其中 1 表示为 TRUEFALSE 表示为0. 由于我们只对 1(即 TRUE)与最多 1 个交集的交集感兴趣,因此我们计算满足此条件的次数,即 lengths == 1(或 lengths <= 1,因为我们最多需要检查)和 values 表示只有 1,即 TRUE

我们也可以写成

sum(with(rle(x & y), lengths * values) == 1)
#[1] 1