【问题标题】:data.table: Merging nearby genomic featuresdata.table:合并附近的基因组特征
【发布时间】:2016-09-16 06:40:11
【问题描述】:

我正在探索使用 data.table 来计算基因组区间,以替代 GenomicRanges。

我有以下问题: 对于像这样的(非常大的)BED 文件:

data.table(chr=c("chr1", "chr1", "chr1", "chr2", "chr2", "chr3"),
                     start=c(8, 10, 20, 7, 10, 30),
                     end=c(9, 12, 25, 13, 12, 40),
                     strand=c("+", "+", "-", "+", "-", "+"),
                     score=c(1.2, 3.2, 0.5, 6.0, 1.0, 9.0))

看起来像:

    chr start end strand score
1: chr1     8   9      +   1.2
2: chr1    10  12      +   3.2
3: chr1    20  25      -   0.5
4: chr2     7  13      +   6.0
5: chr2    10  12      -   1.0
6: chr3    30  40      +   9.0

我想合并附近的特征/范围:对位于同一染色体和链上且在 X 距离内的特征进行分组,并对它们的分数进行一些计算。对于上面的示例,将合并前两个特征并将它们的分数相加:

    chr start end strand score
1: chr1     8  12      +   4.4
2: chr1    20  25      -   0.5
3: chr2     7  13      +   6.0
4: chr2    10  12      -   1.0
5: chr3    30  40      +   9.0

假设没有任何输入特征重叠,有没有使用 data.table 的简单方法?

这个问题可以通过使用 GenomicRanges 中的覆盖、切片和减少功能来解决,但我对 data.table 解决方案特别感兴趣。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    没有交叉路口,你可以这样做:

    setorder(dt, chr, start)
    
    # adjust the comparison to suit your needs
    dt[, grp := cumsum(c(F, head(end, -1) + 1 != tail(start, -1))), by = chr]
    
    dt[, .(start = start[1], end = end[.N], strand = strand[1], score = sum(score))
       , by = .(chr, grp)]
    #    chr grp start end strand score
    #1: chr1   0     8  12      +   4.4
    #2: chr1   1    20  25      -   0.5
    #3: chr2   0     7  13      +   6.0
    #4: chr2   1    10  12      -   1.0
    #5: chr3   0    30  40      +   9.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多