此问题的更一般版本已回答here。一位用户建议我在单独的帖子中问这个问题的更具体版本。
我有两个看起来像这样的逻辑矢量:
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)之间的交点,使得在第一个向量中每运行1s最多计数一个交点。
使用上面提到的答案中的sum(rle(x & y)$values)
,我可以将上述向量的相交总数算作two,但我希望one。
您希望相交的最大长度为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