我有两组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和hits对象获取重叠范围的索引,以便使用findOverlaps +范围进行比较,但是如何将结果组合起来以获得所需的输出是不知所措。
答案 0 :(得分:3)
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
答案 1 :(得分:2)
我认为您需要的是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表示没有重叠。