Точка пересечения двух последовательных профилей - PullRequest
1 голос
/ 07 февраля 2020

У меня есть два вектора профилей идентичности (значения от 0 до 1) и фиксированной длины (определяется базовой последовательностью).

Я хотел бы вычислить точки пересечения обоих профилей, то есть точку, в которой изменяется репрезентативный профиль (с более высокой идентичностью).

Мое текущее решение основано на расчете знака и произведении расчета последовательных чисел. Можете ли вы представить себе более элегантный способ?

a <- c(1,1,1,0.8,0.8,0.8)
b <- c(0.8,0.8,0.8,1,1,1)

z <- sign(a - b)

res <- sapply(2:length(z),function(i){ z[i-1]*z[i] })
idx <- which(res == "-1")

plot(x=1:length(a),y=a,type="b")
points(x=1:length(b),y=b,type="b")
abline(v=idx,col="red")

1 Ответ

2 голосов
/ 07 февраля 2020

Возможно, вы можете получить idx, используя sign и diff

which(diff(sign(a - b)) != 0)
#[1] 3

Так что если у вас есть a и b как

a <- c(1,1,1,0.8,0.8,0.8,1,1)
b <- c(0.8,0.8,0.8,1,1,1,0.8,0.8)

This вернется

idx <- which(diff(sign(a - b)) != 0)
idx
#[1] 3 6

и график будет выглядеть так:

plot(x= 1:length(a),y=a,type="b")
points(x=1:length(b),y=b,type="b")
abline(v=idx,col="red")

enter image description here

...