0

A more general version of this question has been answered here. A user proposed I ask this more specific version of the question as a separate post.

I have two logical vectors which look like this:

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)

I want to count the intersections between ranges of consecutive values (in this example 1111) in such a way, that at most one intersection per run of 1s in the first vector is counted.

Using sum(rle(x & y)$values) from the above mentioned answer, I can count the total number of intersections of the above vectors as two, but I expect one.

Cos
  • 1,649
  • 1
  • 27
  • 50

2 Answers2

2

Do you want max length of the intersection to be 1. If so, you can do

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

When we do x & y the numeric values of x and y are changed to logical values where 1 is represented as TRUE and FALSE as 0. Since we are only interested in intersection of 1's (i.e TRUE) with at most 1 intersection we count the number of times where this condition is satisfied i.e lengths == 1 (or lengths <= 1 as we need to check for at most) and values meaning only 1's i.e TRUE.

Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
0

We can also write it as

sum(with(rle(x & y), lengths * values) == 1)
#[1] 1
akrun
  • 874,273
  • 37
  • 540
  • 662