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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:10:27