R объединяет вывод findOverlaps и countOverlaps
У меня есть два набора IRanges для сравнения. Моя цель состоит в том, чтобы получить выходные данные, которые имеют положение перекрытий, если оно существует, и смещение диапазонов, указанных как отрицательное начало, если они не перекрываются. По крайней мере, если я не могу получить смещение, я хотел бы получить "0", чтобы указать, что нет перекрытия. Например:
xx<-IRanges(start=c(2,9,19,31,45), end=c(3,11,23,35,49))
IRanges of length 5
start end width
[1] 2 3 2
[2] 9 11 3
[3] 19 23 5
[4] 31 35 5
[5] 45 49 5
а также
yy<-IRanges(start=c(4,10,19,33,45), end=c(5,13,25,38,48))
IRanges of length 5
start end width
[1] 4 5 2
[2] 10 13 4
[3] 19 25 7
[4] 33 38 6
[5] 45 48 4
Использование диапазонов findOverlaps + дает мне:
> fo <-findOverlaps(xx,yy)
> ranges(fo, xx, yy)
IRanges of length 4
start end width
[1] 10 11 2
[2] 19 23 5
[3] 33 35 3
[4] 45 48 4
Я хотел бы, чтобы конечный результат был кадром данных или что-то вроде этого:
start end width
[1] -1 0 0
[2] 10 11 2
[3] 19 23 5
[4] 33 35 3
[5] 45 48 4
Я могу получить индексы диапазонов, которые перекрываются, используя countOverlaps, и объект совпадений для сравнения, используя findOverlaps + диапазоны, но я не знаю, как объединить результаты, чтобы получить желаемый результат.
2 ответа
library(IRanges)
f <- function(a,b)
{
s <- max(a$start,b$start)
e <- min(a$end,b$end)
if ( s <= e )
{
ovlp <- c( start = s,
end = e,
width = e-s+1 )
} else
{
ovlp <- c( start = e-s,
end = 0,
width = NA )
}
return(ovlp)
}
findOvlp <- function( X, Y )
{
if ( length(X) != length(Y) ){ stop("length(X) != length(Y)") }
n <- length(X)
X.df <- as.data.frame(X)
Y.df <- as.data.frame(Y)
Z <- data.frame( start = rep(NA,length(X)),
end = rep(NA,length(X)),
width = rep(NA,length(X)) )
for ( i in 1:n ) { Z[i,] <- f(X.df[i,],Y.df[i,]) }
return( Z )
}
,
> xx<-IRanges(start=c(2,9,19,31,45), end=c(3,11,23,35,49))
> yy<-IRanges(start=c(4,10,19,33,45), end=c(5,13,25,38,48))
> findOvlp(xx,yy)
start end width
1 -1 0 NA
2 10 11 2
3 19 23 5
4 33 35 3
5 45 48 4
Я думаю, что вам нужно это pintersect
функция в IRanges
,
library(IRanges)
xx <- IRanges(start=c(2,9,19,31,45), end=c(3,11,23,35,49))
yy <- IRanges(start=c(4,10,19,33,45), end=c(5,13,25,38,48))
pintersect(xx, yy)
# IRanges of length 5
# start end width
# [1] 4 3 0
# [2] 10 11 2
# [3] 19 23 5
# [4] 33 35 3
# [5] 45 48 4
width
= 0 указывает на отсутствие перекрытий.