是否存在R函数可拆分无法完全适配窗口区间的块区间?
拆分跨窗口的区间数据:R语言现成工具推荐
用foverlaps合并两个数据框后,存在大量块区间无法完全适配窗口区间的情况(比如块跨多个窗口),需要将这类块拆分为对应窗口内的子区间。例如当窗口为0-100、块为56-139时,拆分为0-100区间内的56-100,以及100-200区间内的100-139。
原始数据
window_start_1 window_end_1 block_start_1 block_end_1 1: 0 100000 5361 70817 2: 0 100000 71240 94801 3: 0 100000 95115 95965 4: NA NA 96099 181692 5: NA NA 182089 202832 6: 200000 300000 203053 203513 7: 200000 300000 203957 252559 8: 200000 300000 255798 281602 9: 200000 300000 282652 285340 10: 200000 300000 285821 286233 11: 200000 300000 286452 286747 12: NA NA 287001 307802 13: 300000 400000 308305 318149 14: 300000 400000 319175 323252 15: 300000 400000 323461 333007
期望输出
window_start_1 window_end_1 block_start_1 block_end_1 1: 0 100000 5361 70817 2: 0 100000 71240 94801 3: 0 100000 95115 95965 4: 0 100000 96099 100000 5: 100000 200000 100000 181692 6: 100000 200000 182089 200000 7: 200000 300000 200000 202832 8: 200000 300000 203053 203513 9: 200000 300000 203957 252559 10: 200000 300000 255798 281602 11: 200000 300000 282652 285340 12: 200000 300000 285821 286233 13: 200000 300000 286452 286747 14: 200000 300000 287001 300000 15: 300000 400000 300000 307802 16: 300000 400000 308305 318149 17: 300000 400000 319175 323252 18: 300000 400000 323461 333007
现成工具:IRanges包
Bioconductor的IRanges包是专门处理区间数据的工具,能高效完成区间重叠、拆分、交集计算等操作,完全匹配你的需求。
代码示例
# 安装并加载IRanges if (!requireNamespace("IRanges", quietly = TRUE)) BiocManager::install("IRanges") library(IRanges) library(data.table) # 原始数据 dt <- data.table( window_start_1 = c(0,0,0,NA,NA,200000,200000,200000,200000,200000,200000,NA,300000,300000,300000), window_end_1 = c(100000,100000,100000,NA,NA,300000,300000,300000,300000,300000,300000,NA,400000,400000,400000), block_start_1 = c(5361,71240,95115,96099,182089,203053,203957,255798,282652,285821,286452,287001,308305,319175,323461), block_end_1 = c(70817,94801,95965,181692,202832,203513,252559,281602,285340,286233,286747,307802,318149,323252,333007) ) # 构建完整的窗口区间(步长100000) windows <- IRanges(start = seq(0, 300000, by = 100000), end = seq(100000, 400000, by = 100000)) # 转换块数据为IRanges对象 blocks <- IRanges(start = dt$block_start_1, end = dt$block_end_1) # 找到所有块与窗口的重叠关系 overlaps <- findOverlaps(blocks, windows) # 计算每个重叠部分的交集(即拆分后的块区间) intersected_blocks <- pintersect(blocks[queryHits(overlaps)], windows[subjectHits(overlaps)]) # 整理成目标格式 result <- data.table( window_start_1 = start(windows[subjectHits(overlaps)]), window_end_1 = end(windows[subjectHits(overlaps)]), block_start_1 = start(intersected_blocks), block_end_1 = end(intersected_blocks) ) # 按窗口和块起始位置排序 setorder(result, window_start_1, block_start_1)
代码说明
IRanges():将窗口和块数据转换为区间对象,方便后续操作。findOverlaps():找出所有块与窗口的重叠配对,确定哪些块需要拆分到哪些窗口。pintersect():计算每个块与对应窗口的交集,得到拆分后的子块区间。- 最后将结果转换回
data.table格式并排序,得到期望输出。
如果不需要Bioconductor包,也可以用data.table手动实现逻辑,但IRanges是更专业、高效的现成工具。
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

