在含其他非位置值的数据框中合并重叠起止区间
汇总BLAST结果:合并Query的重叠/包含区间并重新计算覆盖度
我正在处理BLAST比对结果,目的是统计contig(作为Query)相对于数据库中Subject序列的完整覆盖度。目前我有一个包含核心BLAST输出字段的数据框,关键字段包括:
qlen:Query序列的总长度length:当前比对结果中Query与Subject的匹配长度qstart:Query上的比对起始位置qend:Query上的比对终止位置qcovhsp:该条比对结果覆盖Query的百分比
可复现示例
df = data.frame(qlen=c(100, 100, 100, 100, 100), length=c(10, 10, 15, 30, 10), qstart=c(1, 25, 30, 50, 70), qend=c(10, 34, 44, 79, 79), qcovhsp=c(10, 10, 15, 30, 10))
对应的数据表如下:
| qlen | length | qstart | qend | qcovhsp |
|---|---|---|---|---|
| 100 | 10 | 1 | 10 | 10 |
| 100 | 10 | 25 | 34 | 10 |
| 100 | 15 | 30 | 44 | 15 |
| 100 | 30 | 50 | 79 | 30 |
| 100 | 10 | 70 | 79 | 10 |
期望的处理效果
我需要对上述数据进行区间合并处理,规则如下:
- 若一个区间完全包含另一个区间,直接将被包含的区间并入包含区间(例如示例中第4行的区间包含第5行,直接吸收)
- 若两个区间存在重叠部分,将它们合并为一个连续的区间(例如示例中第2行和第3行区间重叠,合并为一个区间)
- 合并后需要重新计算
length(合并后区间的实际长度)和qcovhsp(该区间占Query总长度的百分比)
处理后的目标数据表如下:
| qlen | length | qstart | qend | qcovhsp |
|---|---|---|---|---|
| 100 | 10 | 1 | 10 | 10 |
| 100 | 20 | 25 | 44 | 20 |
| 100 | 30 | 50 | 79 | 30 |
后续分析逻辑
我已经编写了后续脚本,用于计算Query的总覆盖度(本例中总覆盖度为60%),后续会筛选保留总覆盖度超过70%的contig与Subject的组合。我的整体业务需求是:将组装得到的完整序列与质粒数据库进行BLAST比对,筛选出一致性≥98%(该过滤步骤已完成)且总覆盖度≥70%的contig。
遇到的问题
我在Stack Overflow上搜索过相关解决方案,但没有找到完全匹配我需求的内容。虽然看到过一篇关于合并重叠区间的文章,但不确定如何将其扩展应用到包含多列附加字段的数据框上。另外,我提问经验较少,也希望得到关于提问方式的改进建议。
内容的提问来源于stack exchange,提问作者David Bradshaw
相关产品推荐
相关产品推荐

