在R中基于另一数据框的多条件为目标数据框生成真假列
问题解决:给数据框添加染色体位置匹配判断列
示例数据构造
先复现你提供的两个数据框,方便验证代码:
# 目标数据框 df1 df1 <- data.frame( chr_snp = c(1,1,1,2,2,3), loc_snp = c(184319928, 276998062, 278255864, 243012470, 123072103, 526785124), ma_snp = c("T", "A", "G", "G", "T", "A") ) # 参考数据框 df2 df2 <- data.frame( chr_QTL = c(1,1,2), loc_QTL = c(281788173, 203085725, 241577141), ma_QTL = c("G", "C", "C") )
方法一:使用dplyr包(简洁高效)
通过分组匹配+条件判断实现需求,代码逻辑清晰:
library(dplyr) df_result <- df1 %>% group_by(chr_snp) %>% mutate( # 检查当前行位置是否在同染色体任意QTL的±1000万碱基对范围内 Match = any( loc_snp >= df2$loc_QTL[df2$chr_QTL == cur_group()$chr_snp] - 1e7 & loc_snp <= df2$loc_QTL[df2$chr_QTL == cur_group()$chr_snp] + 1e7 ), # 处理无对应染色体的情况(如chr=3),将NA转为FALSE Match = ifelse(is.na(Match), FALSE, Match) ) %>% ungroup() print(df_result)
方法二:基础R实现(无需额外安装包)
用自定义函数结合mapply处理每一行:
# 定义判断函数:输入染色体和位置,返回是否匹配 check_match <- function(chr, loc) { # 筛选同染色体的所有QTL位置 qtl_locs <- df2$loc_QTL[df2$chr_QTL == chr] # 无对应染色体直接返回FALSE if (length(qtl_locs) == 0) return(FALSE) # 检查位置是否在任意QTL的±1000万范围内 any(loc >= qtl_locs - 1e7 & loc <= qtl_locs + 1e7) } # 给df1添加Match列 df1$Match <- mapply(check_match, df1$chr_snp, df1$loc_snp) print(df1)
两种方法运行后都会得到你需要的结果:
chr_snp loc_snp ma_snp Match 1 1 184319928 T FALSE 2 1 276998062 A TRUE 3 1 278255864 G TRUE 4 2 243012470 G TRUE 5 2 123072103 T FALSE 6 3 526785124 A FALSE
内容的提问来源于stack exchange,提问作者Melderon
相关产品推荐
相关产品推荐

