data.table:合并附近的基因组特征

时间:2016-09-16 06:40:12

标签: r data.table

我正在探索使用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中的coverage,slice和reduce函数来解决,但我对data.table解决方案特别感兴趣。

1 个答案:

答案 0 :(得分:0)

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

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