将基因组分段为相邻的非重叠区间,例如通过tileGenome
方法,我已经为每个区间计算了某些属性(比如说1或2)。
现在我想合并相邻具有相同属性的区间。 下面是一个最简示例:
library(GenomicRanges)
chrSizes <- c(chr1 = 1000, chr2 = 500)
bins <- tileGenome(chrSizes, tilewidth = 200, cut.last.tile.in.chrom = T)
bins$property <- rep(1:2, each = 4)
bins
GRanges object with 8 ranges and 1 metadata column:
seqnames ranges strand | property
<Rle> <IRanges> <Rle> | <integer>
[1] chr1 1-200 * | 1
[2] chr1 201-400 * | 1
[3] chr1 401-600 * | 1
[4] chr1 601-800 * | 1
[5] chr1 801-1000 * | 2
[6] chr2 1-200 * | 2
[7] chr2 201-400 * | 2
[8] chr2 401-500 * | 2
-------
seqinfo: 2 sequences from an unspecified genome
前四个箱子具有属性1,因此应该合并为一个箱子。 我查看了GRanges的文档,没有明显的本地解决方案。请注意,必须考虑 seqname 边界(例如,chr1 和 chr2 保持分开,无论属性如何)。显然,可以使用循环,但我宁愿使用原生 GRange 解决方案,例如使用 union 可能已经被我忽略了。 期望的输出应该类似于这样:
seqnames ranges strand | property
<Rle> <IRanges> <Rle> | <integer>
[1] chr1 1-800 * | 1
[2] chr1 801-1000 * | 2
[3] chr2 1-500 * | 2
result <- unlist(reduce(split(bins, ~property))); result$score <- names(result)
。如果您同意的话,请随时更新答案。 - Sebastian Müller