如何在缩减GRanges对象时保留元数据列?
在缩减GRanges对象时保留元数据列
问题重现
我尝试缩减一个GRanges对象,但调用reduce()函数后,元数据列(如score)会丢失。以下是示例数据和问题表现:
示例GRanges对象
library(GenomicRanges) # 构建示例数据 gr <- GRanges(seqnames = c("chr1", "chr1", "chr1"), ranges = IRanges(c(11, 101, 101), c(20, 200, 200)), strand = c("+", "-", "-"), name = c("a1", "a2", "a2"), score = c(1, 2, 3)) # 查看原对象 gr
输出:
seqnames ranges strand | name score <Rle> <IRanges> <Rle> | <character> <integer> [1] chr1 11-20 + | a1 1 [2] chr1 101-200 - | a2 2 [3] chr1 101-200 - | a2 3
直接使用reduce()的问题
调用原生reduce()会丢弃所有元数据列:
reduce(gr)
输出:
seqnames ranges strand <Rle> <IRanges> <Rle> [1] chr1 11-20 + [2] chr1 101-200 -
期望结果
希望缩减区间的同时保留元数据,比如将同一区间的score合并展示:
seqnames ranges strand score <Rle> <IRanges> <Rle> [1] chr1 11-20 + 1 [2] chr1 101-200 - 2,3
解决方案
以下两种方法均可实现缩减区间并保留元数据的需求:
方法1:使用GenomicRanges原生函数
先生成缩减后的区间,再通过重叠匹配关联原数据,最后聚合元数据列:
# 1. 生成缩减后的GRanges gr_reduced <- reduce(gr) # 2. 匹配原数据与缩减后区间的重叠关系 ov <- findOverlaps(gr, gr_reduced) # 3. 聚合score列,用逗号分隔同一区间的多个值 mcols(gr_reduced)$score <- aggregate( x = mcols(gr)$score[queryHits(ov)], by = list(subjectHits(ov)), FUN = function(x) paste(x, collapse = ", ") )$x # 查看最终结果 gr_reduced
方法2:使用plyranges包(语法更简洁)
plyranges提供了类tidy的语法,适合分组聚合操作:
library(plyranges) gr %>% group_by(seqnames, strand) %>% # 按染色体和链分组 reduce_ranges(score = paste(score, collapse = ", ")) # 缩减区间并合并score
两种方法都能得到符合预期的结果,既完成区间缩减,又保留并合并了对应元数据。
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

