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

如何判断数据框POS列的每个值是否属于另一数据框的任一区间?

如何判断位置值是否落在任意基因区间内?

我有一组位置值数据:

> head(jap["POS"])
      POS
1  836924
2  922009
3 1036959
4 141607615
5 164000000 
6 118528028 
[...]

还有一组基因区间数据(第一行是区间起始,第二行是区间终止):

> genes_of_interest
       MGAM        SI      TREH    SLC2A2  SLC2A5   SLC5A1  TAS1R3       LCT
1 141607613 164696686 118528026 170714137 9095166 32439248 1266660 136545420
2 141806547 164796284 118550359 170744539 9148537 32509016 1270694 136594754

需求是检查每个位置值是否落在上述任意一个基因区间内,预期结果为:

FALSE FALSE FALSE TRUE FALSE TRUE

(注:141607615属于MGAM区间,118528028属于TREH区间)

实现方法

方法一:基础R实现(适合小数据集)

先将区间数据整理成更易处理的格式,再逐个检查位置值:

# 把区间数据转换为包含基因名、起始、终止的DataFrame
intervals <- data.frame(
  gene = colnames(genes_of_interest),
  start = unlist(genes_of_interest[1, ]),
  end = unlist(genes_of_interest[2, ])
)

# 遍历每个位置值,判断是否落在任意区间内
result <- sapply(jap$POS, function(pos) {
  any(intervals$start <= pos & intervals$end >= pos)
})

# 输出结果
result

方法二:用GenomicRanges包实现(适合大数据集,效率更高)

GenomicRanges是专门处理基因组区间的工具包,适合大规模数据的快速匹配:

# 安装包(首次使用时执行)
# install.packages("GenomicRanges")
library(GenomicRanges)

# 将位置值转为GRanges对象(假设所有位置都在chr1,需根据实际染色体修改)
pos_gr <- GRanges(
  seqnames = "chr1",
  ranges = IRanges(start = jap$POS, end = jap$POS)
)

# 将基因区间转为GRanges对象
gene_gr <- GRanges(
  seqnames = "chr1",
  ranges = IRanges(
    start = unlist(genes_of_interest[1, ]),
    end = unlist(genes_of_interest[2, ])
  )
)

# 检查每个位置是否与任意区间重叠
result <- overlapsAny(pos_gr, gene_gr)

# 输出结果
result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:07:09