我正在探索使用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解决方案特别感兴趣。
答案 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