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

R中等长连续bin计数映射到基因组不规则非重叠bin的实现

R实现基因组区间计数按重叠比例分配方案

实现逻辑

核心通过GenomicRanges的高效区间匹配能力,计算小bin与目标不规则bin的重叠占比,按比例分配计数后按目标bin聚合即可,可轻松处理十万级行数据。

代码实现

1. 依赖包加载

library(GenomicRanges)
library(dplyr)

2. 数据格式转换

将两个输入数据框转换为GRanges对象,假设小bin数据框名为small_bin,目标不规则bin数据框名为large_bin:

# 小bin转GRanges对象,保留计数与bin宽度
gr_small <- GRanges(
  seqnames = small_bin$chr,
  ranges = IRanges(start = small_bin$from, end = small_bin$to),
  BS_seq_Count = small_bin$BS_seq_Count,
  small_width = width(.)
)

# 目标大bin转GRanges对象,添加唯一ID方便后续聚合
gr_large <- GRanges(
  seqnames = large_bin$chr,
  ranges = IRanges(start = large_bin$from, end = large_bin$to),
  large_id = 1:nrow(large_bin)
)

3. 重叠匹配与计数分配

# 匹配所有重叠区间
ov <- findOverlaps(gr_small, gr_large)

# 提取重叠对的相关数据
ov_df <- data.frame(
  small_count = mcols(gr_small[queryHits(ov)])$BS_seq_Count,
  small_width = mcols(gr_small[queryHits(ov)])$small_width,
  ov_start = pmax(start(gr_small[queryHits(ov)]), start(gr_large[subjectHits(ov)])),
  ov_end = pmin(end(gr_small[queryHits(ov)]), end(gr_large[subjectHits(ov)])),
  large_id = mcols(gr_large[subjectHits(ov)])$large_id
)

# 计算重叠占比与分配计数
ov_df <- ov_df %>%
  mutate(
    ov_width = ov_end - ov_start + 1, # 适配基因组1-based坐标
    allocated = (ov_width / small_width) * small_count
  )

# 按目标bin聚合计数
count_res <- ov_df %>%
  group_by(large_id) %>%
  summarise(count = sum(allocated))

4. 结果拼接

# 聚合结果合并回原目标bin数据框
final_res <- large_bin %>%
  mutate(large_id = 1:nrow(.)) %>%
  left_join(count_res, by = "large_id") %>%
  select(-large_id) %>%
  mutate(count = replace(count, is.na(count), 0)) # 无重叠的bin计数设为0

说明

该方案和你给出的示例计算逻辑完全匹配,以第一个目标bin(200-700)为例:

  • 与小bin1(1-500)重叠长度301,分配计数3*(301/500)≈1.8
  • 与小bin2(501-1000)重叠长度200,分配计数10*(200/500)=4
  • 合计计数≈5.8,和示例结果一致。

内容的提问来源于stack exchange,提问作者LawrenceThundersthorp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:08