You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在缩减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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:44:59