R 如何处理两个bed文件以并行查找重叠区域?

R 如何处理两个bed文件以并行查找重叠区域?,r,parallel-processing,bioinformatics,bed,R,Parallel Processing,Bioinformatics,Bed,我想处理多个bed文件以查找重叠区域。我将数据集读取为数据帧,如何高效地并行扫描两个数据集,以检测重叠区域出现的位置。我的方法是每次以数据帧对象的每个单元格的峰值区域作为查询,在intervaltree中取另一个数据帧的所有行的峰值区域,然后搜索重叠区域。我对如何在R中实现这一点感到困惑。请帮助我处理生物信息学中的bed格式文件。如果有人告诉我怎么做,我将不胜感激 这是我想要实现的一个简单示例: [1] chr1 [10171, 10226] * | MACS_peak_1

我想处理多个bed文件以查找重叠区域。我将数据集读取为数据帧,如何高效地并行扫描两个数据集,以检测重叠区域出现的位置。我的方法是每次以数据帧对象的每个单元格的峰值区域作为查询,在intervaltree中取另一个数据帧的所有行的峰值区域,然后搜索重叠区域。我对如何在R中实现这一点感到困惑。请帮助我处理生物信息学中的bed格式文件。如果有人告诉我怎么做,我将不胜感激

这是我想要实现的一个简单示例:

  [1]     chr1 [10171, 10226]      * | MACS_peak_1      7.12
  [2]     chr1 [32698, 33079]      * | MACS_peak_2     13.92
  [3]     chr1 [34757, 34794]      * | MACS_peak_3      6.08
  [4]     chr1 [37786, 37833]      * | MACS_peak_4      2.44
  [5]     chr1 [38449, 38484]      * | MACS_peak_5      3.61
  [6]     chr1 [38584, 38838]      * | MACS_peak_6      4.12
  ..
  ..
  []     chrX [155191467, 155191508]      * | MACS_peak_77948      3.80
  []     chrX [155192786, 155192821]      * | MACS_peak_77949      3.71
  []     chrX [155206352, 155206433]      * | MACS_peak_77950      3.81
  []     chrX [155238796, 155238831]      * | MACS_peak_77951      3.81
  [n-1]     chrX [155246563, 155246616]      * | MACS_peak_77952      2.44
  [n]     chrX [155258442, 155258491]      * | MACS_peak_77953      5.08



  #step 1: read two bed files in R:

    bed_1 <- as(import.bed(bedFile_1), "GRanges")
    bed_2 <- as(import.bed(bedFile_2), "GRanges")
    bed_3 <- as(import.bed(bedFile_3), "GRanges")

  step 2: extract first row of the bed_1 (only take one specific interval as query). each row is considered as one specific genomic interval

    peak <- bed_1[1]      # only take one row once
    bed_2.intvl <- GenomicRanges::GIntervalTree(bed_2)

  #step 3: find overlapped regions:

    overlap <- GenomicRanges::findOverlaps(peak, bed_2.intvl)
  # step 4: go back to original bed_2 and look at which interval were overlapped with peak that comes from bed_1, what's the significance of each of these interval that comes from bed_2.

  # step 5: then iterate next interval from bed_1 to repeat above process
[1]chr1[1017110226]*| MACS_peak|u 17.12
[2] chr1[3269833079]*| MACS_peak_2 13.92
[3] chr1[3475734794]*| MACS_peak_3 6.08
[4] chr1[377863783]*| MACS_peak_4 2.44
[5] chr1[3844938484]*| MACS_peak_5 3.61
[6] chr1[3858438838]*| MACS_peak_6 4.12
..
..
[]chrX[155191467155191508]*| MACS_peak_77948 3.80
[]chrX[155192786155192821]*| MACS_peak|u 77949 3.71
[]chrX[155206352155206433]*| MACS_peak_77950 3.81
[]chrX[155238796155238831]*| MACS_peak_77951 3.81
[n-1]chrX[155246563,155246616]*| MACS_peak_77952 2.44
[n] chrX[155258442155258491]*| MACS_peak_77953 5.08
#步骤1:读取R中的两个bed文件:
bed_1使用,使用导入bed文件

然后查询“重叠”;也许这对你意味着什么还不太清楚

bed1OverlappingBed2 = bed1[bed1 %over% bed2]
更灵活的是,
findOverlaps(bed1、bed2)
。这种方法的后续问题应直接向Bioconductor提出

假设我们输入了一个
查询
和一个
主题
。找到所有的热门歌曲

hits <- findOverlaps(query, subject)
找到它们重叠的区域的交点

pintersect(query[queryHits(hits)], subject[subjectHits(hits)])
这为您提供了元素级的重叠,但没有进行迭代

作为一个小示例,“chr1”上的一些范围表示为
GRanges
对象(bed文件也表示为GRanges,但带有附加的
mcols()
以及bed文件中的信息)

他们看起来像

> query
GRanges object with 3 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1  [10, 14]      *
  [2]     chr1  [20, 24]      *
  [3]     chr1  [30, 34]      *
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
> subject
GRanges object with 2 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1  [10, 18]      *
  [2]     chr1  [14, 22]      *
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
>查询
具有3个范围和0个元数据列的GRanges对象:
seqnames范围链
[1] chr1[10,14]*
[2] chr1[20,24]*
[3] chr1[30,34]*
-------
seqinfo:1个来自未指定基因组的序列;没有长度
>主题
具有2个范围和0个元数据列的GRanges对象:
seqnames范围链
[1] chr1[10,18]*
[2] chr1[14,22]*
-------
seqinfo:1个来自未指定基因组的序列;没有长度
以下是点击率:

> hits = findOverlaps(query, subject)
> hits
Hits object with 3 hits and 0 metadata columns:
      queryHits subjectHits
      <integer>   <integer>
  [1]         1           1
  [2]         1           2
  [3]         2           2
  -------
  queryLength: 3
  subjectLength: 2
>hits=findOverlaps(查询,主题)
>击中
具有3个命中和0个元数据列的命中对象:
查询其主题
[1]         1           1
[2]         1           2
[3]         2           2
-------
查询长度:3
主题长度:2
您可以看到,查询的第一个范围与主题的范围1和2重叠。这是相交范围

> pintersect(query[queryHits(hits)], subject[subjectHits(hits)])
GRanges object with 3 ranges and 1 metadata column:
      seqnames    ranges strand |       hit
         <Rle> <IRanges>  <Rle> | <logical>
  [1]     chr1  [10, 14]      * |      TRUE
  [2]     chr1  [14, 14]      * |      TRUE
  [3]     chr1  [20, 22]      * |      TRUE
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
>pintersect(查询[queryHits(hits)],主题[subjectHits(hits)])
具有3个范围和1个元数据列的GRanges对象:
seqnames strand |命中
| 
[1] chr1[10,14]*|正确
[2] chr1[14,14]*|正确
[3] chr1[20,22]*|正确
-------
seqinfo:1个来自未指定基因组的序列;没有长度
因此,查询1和主题1从位置10到14重叠,查询1和主题2在位置14重叠,查询2和主题2在位置20到22重叠。(Bioconductor使用基于1的闭合间隔;UCSC使用基于0的半开放间隔;
rtracklayer::import.bed()
在导入文件时做了正确的事情。

使用

然后查询“重叠”;可能不太清楚这对您意味着什么

bed1OverlappingBed2 = bed1[bed1 %over% bed2]
更灵活地说,
findOverlaps(bed1,bed2)
。这种方法的后续问题应直接向生物导体提出

假设我们输入了一个
查询
和一个
主题

hits <- findOverlaps(query, subject)
找到它们重叠的区域的交点

pintersect(query[queryHits(hits)], subject[subjectHits(hits)])
这为您提供了元素级的重叠,但没有进行迭代

作为一个小示例,“chr1”上的一些范围表示为
GRanges
对象(bed文件也表示为GRanges,但带有附加的
mcols()
以及bed文件中的信息)

他们看起来像

> query
GRanges object with 3 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1  [10, 14]      *
  [2]     chr1  [20, 24]      *
  [3]     chr1  [30, 34]      *
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
> subject
GRanges object with 2 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1  [10, 18]      *
  [2]     chr1  [14, 22]      *
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
>查询
具有3个范围和0个元数据列的GRanges对象:
seqnames范围链
[1] chr1[10,14]*
[2] chr1[20,24]*
[3] chr1[30,34]*
-------
seqinfo:1个来自未指定基因组的序列;无seqinfo长度
>主题
具有2个范围和0个元数据列的GRanges对象:
seqnames范围链
[1] chr1[10,18]*
[2] chr1[14,22]*
-------
seqinfo:1个来自未指定基因组的序列;无seqinfo长度
以下是点击率:

> hits = findOverlaps(query, subject)
> hits
Hits object with 3 hits and 0 metadata columns:
      queryHits subjectHits
      <integer>   <integer>
  [1]         1           1
  [2]         1           2
  [3]         2           2
  -------
  queryLength: 3
  subjectLength: 2
>hits=findOverlaps(查询,主题)
>击中
具有3个命中和0个元数据列的命中对象:
查询其主题
[1]         1           1
[2]         1           2
[3]         2           2
-------
查询长度:3
主题长度:2
您可以看到,查询的第一个范围与主题的范围1和2重叠

> pintersect(query[queryHits(hits)], subject[subjectHits(hits)])
GRanges object with 3 ranges and 1 metadata column:
      seqnames    ranges strand |       hit
         <Rle> <IRanges>  <Rle> | <logical>
  [1]     chr1  [10, 14]      * |      TRUE
  [2]     chr1  [14, 14]      * |      TRUE
  [3]     chr1  [20, 22]      * |      TRUE
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
>pintersect(查询[queryHits(hits)],主题[subjectHits(hits)])
具有3个范围和1个元数据列的GRanges对象:
seqnames strand |命中
|