计算两个逻辑向量中第一个中每 运行 个 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
时,x
和 y
的数值更改为逻辑值,其中 1 表示为 TRUE
,FALSE
表示为0. 由于我们只对 1(即 TRUE
)与最多 1 个交集的交集感兴趣,因此我们计算满足此条件的次数,即 lengths == 1
(或 lengths <= 1
,因为我们最多需要检查)和 values
表示只有 1,即 TRUE
。
我们也可以写成
sum(with(rle(x & y), lengths * values) == 1)
#[1] 1
已回答此问题的更一般版本
我有两个逻辑向量,如下所示:
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
时,x
和 y
的数值更改为逻辑值,其中 1 表示为 TRUE
,FALSE
表示为0. 由于我们只对 1(即 TRUE
)与最多 1 个交集的交集感兴趣,因此我们计算满足此条件的次数,即 lengths == 1
(或 lengths <= 1
,因为我们最多需要检查)和 values
表示只有 1,即 TRUE
。
我们也可以写成
sum(with(rle(x & y), lengths * values) == 1)
#[1] 1