如何在R中按碱基对范围合并两个DataFrame并匹配区间编号?
基于碱基对范围合并两个DataFrame的方法
首先需要注意:你的Basepair、BP_start、BP_end列都是字符类型,无法直接进行数值范围比较,第一步要先转换为数值型。
方法一:使用dplyr按行匹配
# 加载dplyr包 library(dplyr) # 转换字符型碱基对列为整数型 df <- df %>% mutate(Basepair = as.integer(Basepair)) df_sweep <- df_sweep %>% mutate(across(c(BP_start, BP_end), as.integer)) # 为每个SNP匹配对应的sweep_nr df_merged <- df %>% rowwise() %>% mutate(sweep_nr = df_sweep$sweep_nr[Basepair >= BP_start & Basepair < BP_end]) %>% ungroup()
这里用rowwise()按行处理,每一行的Basepair会匹配df_sweep中符合区间条件的sweep_nr,由于每个SNP只会落在一个区间内,直接提取对应值即可。
方法二:使用fuzzyjoin包直接做范围连接
fuzzyjoin包专门用于处理非精确匹配的连接场景,范围匹配非常方便:
# 加载fuzzyjoin包 library(fuzzyjoin) # 转换数据类型(若未转换) df <- df %>% mutate(Basepair = as.integer(Basepair)) df_sweep <- df_sweep %>% mutate(across(c(BP_start, BP_end), as.integer)) # 执行范围左连接,保留需要的列 df_merged <- fuzzy_left_join( df, df_sweep, by = c("Basepair" = "BP_start", "Basepair" = "BP_end"), match_fun = list(`>=`, `<`) ) %>% select(SNPs, Basepair, sweep_nr)
match_fun参数指定了匹配规则:Basepair >= BP_start且Basepair < BP_end,和你示例中SNP1落在0-100区间的逻辑一致。如果你的区间是包含右端点的,把<改成<=即可。
内容的提问来源于stack exchange,提问作者HelloSanta
相关产品推荐
相关产品推荐

