【问题标题】:R combine output of findOverlaps and countOverlapsR 结合 findOverlaps 和 countOverlaps 的输出
【发布时间】:2015-12-29 18:55:13
【问题描述】:

我有两组 IRange 进行比较。我的目标是获得一个具有重叠位置的输出(如果存在重叠),并且如果它们不重叠,则将范围的偏移列为负开始。至少如果我无法获得偏移量,我希望获得一个“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 + 范围获取 hits 对象进行比较,但不知道如何组合结果以获得所需的输出。

【问题讨论】:

  • 如果您根据您的问题制作一个可重复的最小示例,我们更有可能为您提供帮助。我们可以使用和使用的东西向您展示如何解决您的问题。您可以查看this SO post,了解如何在 R 中制作出色的可重现示例。
  • 很好的可重现示例。一个自发的问题。您是否尝试过在findOverlaps() 调用中调整maxgap?
  • @EricFail 当我玩 maxgap 时,它最终在范围调用中出错。

标签: r iranges


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    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 表示没有重叠。

    【讨论】:

    • 谢谢 - 我不知道这个功能。唯一的事情是我还需要知道非重叠范围之间的差距。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多