首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >findOverlaps和countOverlaps的联合输出

findOverlaps和countOverlaps的联合输出
EN

Stack Overflow用户
提问于 2015-12-29 18:55:13
回答 2查看 586关注 0票数 1

我有两组IRanges要比较。我的目标是获得一个有重叠位置的输出,如果存在重叠,如果它们不重叠的话,作为负开始列出的范围的偏移。至少,如果我不能得到偏移量,我想要一个"0“来表示没有重叠。例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
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 + ranges给我的是:

代码语言:javascript
复制
> 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

我希望最后的输出是一个dataframe或者类似于这样的东西:

代码语言:javascript
复制
       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 + ranges进行比较,但是对于如何组合结果以获得所需的输出,我感到困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-29 23:48:18

代码语言:javascript
复制
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 )
}

代码语言:javascript
复制
> 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
票数 3
EN

Stack Overflow用户

发布于 2015-12-30 01:49:22

我认为您需要的是pintersect函数在IRanges中。

代码语言:javascript
复制
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表示没有重叠。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34517226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档