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
相关产品推荐
相关产品推荐

