【问题标题】:Finding overlapping ranges between two interval data查找两个区间数据之间的重叠范围
【发布时间】:2013-11-03 00:29:51
【问题描述】:

我有一张坐标(start,end)的表格。 500000 个片段和另一个带有 60000 个单一坐标的表,我想与以前的片段匹配。即,对于dtCoords 表中的每条记录,我需要在dtFrags 表中搜索具有相同chr 和startcoordend 的记录(并从中检索type dtFrags 的记录)。为此使用 R 是个好主意,还是我应该看看其他语言?

这是我的例子:

require(data.table)

dtFrags <- fread(
  "id,chr,start,end,type
 1,1,100,200,exon
 2,2,300,500,intron
 3,X,400,600,intron
 4,2,250,600,exon
")

dtCoords <- fread(
"id,chr,coord
 10,1,150
 20,2,300
 30,Y,500
")

最后,我想要这样的东西:

"idC,chr,coord,idF,type
 10,  1,  150,  1, exon
 20,  2,  300,  2, intron
 20,  2,  300,  4, exon
 30,  Y,  500, NA, NA
"

我可以通过chr 将表拆分为子表来简化任务,所以我只关注坐标

setkey(dtCoords, 'chr')
setkey(dtFrags,  'chr')

for (chr in unique(dtCoords$chr)) {
  dtCoordsSub <- dtCoords[chr];
  dtFragsSub  <-  dtFrags[chr];
  dtCoordsSub[, {
    # ????  
  }, by=id]  
}

但我仍然不清楚我应该如何在内部工作......我将非常感谢任何提示。

UPD。以防万一,我把我的真实桌子放在存档here 中。解压到您的工作目录后,可以使用以下代码加载表:

dtCoords <- fread("dtCoords.txt", sep="\t", header=TRUE)
dtFrags  <- fread("dtFrags.txt",  sep="\t", header=TRUE)

【问题讨论】:

  • 我现在没有办法运行 R,但这个问题对我来说似乎很有趣。我认为首先将数据除以染色体,然后我希望您在该范围内没有重复的坐标,然后根据开始和位置制作坐标列。然后稍后与该坐标合并。如果到那时还没有解决,我明天再讨论这个问题

标签: r data.table


【解决方案1】:

一般来说,使用bioconductor 包IRanges 来处理与区间相关的问题是非常合适的。它通过实现interval tree 有效地做到了这一点。 GenomicRanges 是另一个构建在 IRanges 之上的包,专门用于处理“基因组范围”。

require(GenomicRanges)
gr1 = with(dtFrags, GRanges(Rle(factor(chr, 
          levels=c("1", "2", "X", "Y"))), IRanges(start, end)))
gr2 = with(dtCoords, GRanges(Rle(factor(chr, 
          levels=c("1", "2", "X", "Y"))), IRanges(coord, coord)))
olaps = findOverlaps(gr2, gr1)
dtCoords[, grp := seq_len(nrow(dtCoords))]
dtFrags[subjectHits(olaps), grp := queryHits(olaps)]
setkey(dtCoords, grp)
setkey(dtFrags, grp)
dtFrags[, list(grp, id, type)][dtCoords]

   grp id   type id.1 chr coord
1:   1  1   exon   10   1   150
2:   2  2 intron   20   2   300
3:   2  4   exon   20   2   300
4:   3 NA     NA   30   Y   500

【讨论】:

  • 好吧,目前我的最后一条命令出错 (dtFrags[, list(grp, id, type)][dtCoords]):Error in '[.data.table'(dtFrags[, list(grp, id, type)], dtCoords) : When i is a data.table (or character vector), x must be keyed (i.e. sorted, and, marked as sorted) so data.table knows which columns to join to and take advantage of x being sorted. Call setkey(x,...) first, see ?setkey. - 但总的来说,这似乎是一个解决方案,我会尝试解决它,谢谢!
  • 当然,我做了setkey,就像在你的代码中一样(当我检查key(dtCoords) 和key(dtCoords) 时,都返回"grp") - 仍然是同样的错误。
  • oups,看来我制作的样本数据集不是很好...对于我的真实数据,典型情况是一个片段包含多个坐标 - 只需在 dtCoords 表中添加一条记录:说, 50,2,250 - 这样它就会匹配dtFrags 的片段#4 - 在这种情况下,您的代码似乎没有给出我期望的输出......
【解决方案2】:

这行得通吗? 您可以先使用merge,然后再使用subset

   kk<-merge(dtFrags,dtCoords,by="chr",all.x=TRUE)
> kk
   chr id.x start end   type id.y coord
1:   1    1   100 200   exon   10   150
2:   2    2   300 500 intron   20   300
3:   2    4   250 600   exon   20   300
4:   X    3   400 600 intron   NA    NA


 kk[coord>=start & coord<=end]
   chr id.x start end type id.y coord
1:   1    1   100 200 exon   10   150
2:   2    4   250 600 exon   20   300

【讨论】:

  • @Frank,输出几乎没问题(应该只是&gt;= 和&lt;= 而不是&gt; 和&lt;),但我不能将它用于我的大桌子
  • 不幸的是我的桌子似乎太大了,我明白了:Error in vecseq(f__, len__, if (allow.cartesian) NULL else as.integer(max(nrow(x), : Join results in 1447477452 rows; more than 519176 = max(nrow(x),nrow(i)). Check for duplicate key values in i, each of which join to the same group in x over and over again. If that's ok, try including 'j' and dropping 'by' (by-without-by) so that j runs for each group to avoid the large allocation.
  • @VasilyA 这是大小的问题吗?我怀疑可以使该错误出现在一个可重复的小示例中。我知道我之前遇到过四行 data.table
  • 是的,大小确实很重要,恐怕我不能在我的情况下使用这个解决方案:我有 chr 字段的 24 个级别,因此仅通过这个字段合并会产生数十亿个组合。 ..
  • 感谢@Frank,我将尝试挖掘roll 选项。至于重现错误 - 我看不出如何用小例子来做到这一点,但我将链接添加到我的真实数据(帖子末尾的“UPD”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多