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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:57:02