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

在R中基于起始与结束位置重叠查找匹配基因

问题:根据基因位置重叠关系匹配跨组基因

现有如下结构的大型数据框,需要根据start和end的区间重叠关系,找出每个基因匹配的其他组基因,最终得到包含match列的结果:

library(tidyverse)

data <- data.frame(group=c(1,1,1,2,2,2),
                   genes=c("A","B","C","D","E","F"), 
                   start=c(1000,2000,3000,800,400,2000),
                   end=c(1500,2500,3500,1200,500,10000))

# 原数据输出
#>   group genes start   end
#> 1     1     A  1000  1500
#> 2     1     B  2000  2500
#> 3     1     C  3000  3500
#> 4     2     D   800  1200
#> 5     2     E   400   500
#> 6     2     F  2000 10000

期望输出:

#>   group genes start   end   match
#> 1     1     A  1000  1500    A-D
#> 2     1     B  2000  2500    B-F
#> 3     1     C  3000  3500    C-F
#> 4     2     D   800  1200    A-D
#> 5     2     E   400   500    NA
#> 6     2     F  2000 10000    F-C-B

解决方案

核心思路是:先通过自连接找出所有跨组且区间重叠的基因对,再整理每个基因的匹配列表,最后合并回原数据。具体代码如下:

library(tidyverse)

# 1. 定义原数据
data <- data.frame(group=c(1,1,1,2,2,2),
                   genes=c("A","B","C","D","E","F"), 
                   start=c(1000,2000,3000,800,400,2000),
                   end=c(1500,2500,3500,1200,500,10000))

# 2. 找出所有跨组且区间重叠的基因关系
overlaps <- data %>%
  crossing(data) %>%
  # 只匹配不同组的基因
  filter(group.x != group.y) %>%
  # 判断区间是否重叠:x的起始 <= y的结束 且 x的结束 >= y的起始
  filter(start.x <= end.y & end.x >= start.y) %>%
  select(genes.x, genes.y, start.y)

# 3. 整理每个基因的匹配列表
match_list <- overlaps %>%
  group_by(genes.x) %>%
  # 多个匹配基因按start降序排列(对应F的匹配顺序C-B)
  arrange(desc(start.y), .by_group = TRUE) %>%
  # 拼接自身和匹配基因
  summarise(match = c(genes.x, unique(genes.y)) %>% paste(collapse = "-")) %>%
  rename(genes = genes.x)

# 4. 统一双向匹配的格式(比如A和D互相匹配,让D的match和A一致)
match_list <- match_list %>%
  mutate(match = ifelse(
    str_detect(match, "-"),
    pmap_chr(list(genes, match), function(g, m) {
      other_gene <- str_remove(m, paste0(g, "-"))
      if (other_gene %in% match_list$genes) {
        other_match <- match_list$match[match_list$genes == other_gene]
        if (str_detect(other_match, g)) other_match else m
      } else m
    }),
    match
  ))

# 5. 合并回原数据,无匹配项设为NA
result <- data %>%
  left_join(match_list, by = "genes") %>%
  replace_na(list(match = NA))

# 查看结果
print(result)

代码说明

  • 步骤2使用crossing做全自连接,筛选不同组且区间重叠的基因对,区间重叠判断是基因组学中常用的标准逻辑。
  • 步骤3对每个基因的匹配结果按start降序排列,保证F的匹配顺序是C-B。
  • 步骤4处理双向匹配的一致性,比如A和D互相匹配时,两者的match统一为A-D。
  • 最后合并回原数据,给无匹配的基因填充NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:15:33