Подсчет пересечений за цикл 1 с в первом из двух логических векторов - PullRequest
0 голосов
/ 06 января 2020

На более общую версию этого вопроса был дан ответ здесь . Пользователь предложил мне задать эту более конкретную c версию вопроса отдельным постом.

У меня есть два логических вектора, которые выглядят так:

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) из вышеупомянутого ответа, I могу подсчитать общее количество пересечений вышеуказанных векторов как два , но я ожидаю один .

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Хотите ли вы, чтобы максимальная длина пересечения была равна 1. Если это так, вы можете сделать

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

Когда мы сделаем x & y число c значений x и y изменяются на логические значения, где 1 представлен как TRUE, а FALSE - как 0. Поскольку нас интересует только пересечение 1 (т. е. TRUE) с максимум 1 пересечением, мы считаем количество раз, когда это условие удовлетворены, т. е. lengths == 1 (или lengths <= 1, как нам нужно проверить не более), а values означает только 1, т. е. TRUE.

0 голосов
/ 06 января 2020

Мы также можем написать это как

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