通过使用R在较大的基因组间隔上交叉较小的基因组间隔数据来进行覆盖

时间:2011-03-05 01:12:37

标签: r

我想在R中交叉两个基因组区间。我希望在较大的区间内得到较小区间的覆盖率统计数据。

较大的间隔数据是这样的数据框....

Chr  Start     End       Name         Val    Strand
chr7 145444998 146102295 CCDS5889.1   0      +
chr7 146102406 146167735 CCDS5889.1   0      +
chr7 146167929 146371931 CCDS5889.1   0      +

行数超过200万的较小区间就是这样。

Chr  Start     End       Name         Val    Strand PhyloP   
chr7 145444386 145444387 CCDS5889.1   0      +      0.684764
chr7 145444387 145444388 CCDS5889.1   0      +      0.684764
chr7 145444388 145444389 CCDS5889.1   0      +      0.684764
chr7 145444389 145444390 CCDS5889.1   0      +      0.684764

间隔数据位于两个数据框中的第2(从)和第3(到)列。

情况类似于

Large Interval:    [-----]   [-----]     [--------------]   [-------------------]
Small Interval: |||  ||||  |||||||||||  ||||||||   ||||  || |||||||||   ||    ||||||||
  1. 我想知道较小的间隔覆盖了每个较大间隔的数量。
  2. 另外,我会将每个大间隔的交叉$ PhyloP值关联起来,以便日后访问以进行绘图。

1 个答案:

答案 0 :(得分:2)

Bioconductor IRanges和GenomicRanges包具有findOverlapscountOverlapscoverage和其他基于间隔的功能,旨在执行这些操作。您可以使用GRanges函数来表示上面的subject(“较大间隔”)和query(“较小间隔”)对象。请参阅installation instructions,然后看一下插图,例如browseVignettes("GenomicRanges")

稍微详细一点,这是您的数据

sdf <- read.table(textConnection(
"Chr  Start     End       Name         Val    Strand
chr7 145444998 146102295 CCDS5889.1   0      +
chr7 146102406 146167735 CCDS5889.1   0      +
chr7 146167929 146371931 CCDS5889.1   0      +"), header=TRUE)

qdf <- read.table(textConnection(
"Chr  Start     End       Name         Val    Strand PhyloP   
chr7 145444386 145444387 CCDS5889.1   0      +      0.684764
chr7 145444387 145444388 CCDS5889.1   0      +      0.684764
chr7 145444388 145444389 CCDS5889.1   0      +      0.684764
chr7 145444389 145444390 CCDS5889.1   0      +      0.684764"), header=TRUE)

在这里我们将这些转换为GRanges并找到查询与主题

之间的交集
library(GenomicRanges)
subj <-
    with(sdf, GRanges(Chr, IRanges(Start, End), Strand, Val=Val))
query <-
    with(qdf, GRanges(Chr, IRanges(Start, End), Strand, Val=Val,
                      PhyloP=PhyloP, names=Name))
intersect(query, subj)

答案在这里不是很令人兴奋

> intersect(query, subj)
GRanges with 0 ranges and 0 elementMetadata values
     seqnames ranges strand |

seqlengths
 chr7
   NA

为了更有用,这是一个覆盖整个区域的查询

tiles <- successiveIRanges(rep(100, 950), 900, 145444998)
query <- GRanges("chr7", tiles, "+")

我们找到相交的范围,找出每个交叉范围重叠的主题,并总结重叠范围的宽度

int <- intersect(query, subj)
tapply(int, subjectHits(findOverlaps(int, subj)),
       function(x) sum(width(x)))

导致

    1     2     3 
65800  6500 20400