R语言如何用带双重条件的for loop实现两个dataframe匹配新增列
原有代码错误原因
- 逻辑运算符使用错误:
&&仅对左右两侧的第一个元素做判断,你将mockup单行值和cpg整列直接比较,会触发长度不匹配警告,也无法正确校验组合是否存在 - 逻辑判断规则错误:你需要判断的是
(当前行Indication, 当前行Genes)的有序组合是否存在于cpg的(Cancer Type, Gene)组合集合中,而非逐元素相等判断
可行解决方案
方案1:Base R 实现(无需安装额外依赖包)
直接拼接两列生成组合字符串,用%in%判断存在性即可,无需写循环:
# 生成cpg表的癌症类型+基因唯一组合集合 cpg_combo <- paste(cpg$`Cancer Type`, cpg$Gene, sep = "_") # 直接生成新列 mockup$`Hotspot?` <- ifelse(paste(mockup$Indication, mockup$Genes, sep = "_") %in% cpg_combo, "Yes", "No")
方案2:dplyr 实现(更易读的表连接逻辑)
用左连接直接匹配组合,未匹配到的填充为No即可:
library(dplyr) mockup <- mockup %>% # 以两列组合为匹配键左连接 left_join( cpg %>% mutate(`Hotspot?` = "Yes"), by = c("Indication" = "Cancer Type", "Genes" = "Gene") ) %>% # 未匹配到的空值替换为No mutate(`Hotspot?` = coalesce(`Hotspot?`, "No"))
两种方案运行后得到的mockup表均符合预期输出结果。
内容的提问来源于stack exchange,提问作者KLM117
相关产品推荐
相关产品推荐

