如何判断数据框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
相关产品推荐
相关产品推荐

