R如何基于字符串公共ID模式匹配合并两个dataframe的行
错误原因
merge()函数的by参数仅支持指定两个数据框中已存在的列名作为合并依据,无法直接传入正则表达式作为行匹配规则,所以你之前的写法会报错。
解决方案
核心思路是先从两个数据框中分别提取出用于匹配的ID作为临时公共列,再基于该列完成合并,以下提供两种实现方式:
方法1:tidyverse实现(代码简洁易读)
依赖dplyr和stringr包,适合习惯tidy语法的场景:
# 加载依赖 library(dplyr) library(stringr) # 构造示例数据(可替换为你自己的真实数据) DF1 <- data.frame( col1 = c("HAND2", "HAND6"), col2 = c("H2", "H6") ) DF2 <- data.frame( col1 = c("OFS", "FAM"), col2 = c("ID=GATA5;ACS=45", "ID=HAND2;ACS=20") ) # 合并操作 MERGED <- DF2 %>% # 从DF2的col2列提取匹配用的ID mutate(match_id = str_extract(col2, "ID=(.+?);ACS", group = 1)) %>% # 基于ID和DF1合并,用full_join对应你原来的全连接需求 full_join(DF1, by = c("match_id" = "col1")) %>% # 删除临时匹配列,可按需调整列名 select(-match_id)
方法2:base R实现(无需安装额外包)
直接用R原生函数完成操作:
# 构造示例数据(可替换为你自己的真实数据) DF1 <- data.frame( col1 = c("HAND2", "HAND6"), col2 = c("H2", "H6") ) DF2 <- data.frame( col1 = c("OFS", "FAM"), col2 = c("ID=GATA5;ACS=45", "ID=HAND2;ACS=20") ) # 给DF2新增临时匹配ID列 DF2$match_id <- sub("ID=(.+?);ACS.*", "\\1", DF2$col2) # 全连接合并,合并后删除临时列 MERGED <- merge(DF2, DF1, by.x = "match_id", by.y = "col1", all = TRUE, sort = FALSE)[, -1] # 按需重命名列(可选) colnames(MERGED) <- c("col1", "col2", "col3", "col4")
两种方法运行后得到的结果和你给出的示例MERGED完全一致。
内容的提问来源于stack exchange,提问作者Myke
相关产品推荐
相关产品推荐

