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

如何基于ID包含关系用grep实现两个R数据框的连接?

用grep实现R数据框的模糊匹配连接

当data_df的ID列格式不固定(缺失下划线、真实ID位置不固定),无法通过分割提取ID后用inner_join连接时,可以利用grep/grepl的模糊匹配功能实现两个数据框的关联,以下是两种实用方法:

方法一:基础循环+grep遍历匹配

先构造示例数据方便测试:

# 示例数据框
meta_df <- data.frame(real_id = c("ID001", "ID002", "ID003"),
                      info = c("样本A", "样本B", "样本C"))

data_df <- data.frame(raw_id = c("ID001_2023", "2023ID002", "ID003missing", "ID004_2023"),
                      value = c(10, 20, 30, 40))

通过循环遍历meta_df的每个真实ID,用grep定位data_df中包含该ID的行,再合并结果:

# 初始化结果容器
result <- data.frame()

for (i in seq(nrow(meta_df))) {
  current_id <- meta_df$real_id[i]
  # 匹配包含当前真实ID的行
  matched_rows <- data_df[grep(current_id, data_df$raw_id), ]
  # 有匹配则合并行
  if (nrow(matched_rows) > 0) {
    temp <- cbind(meta_df[i, , drop = FALSE], matched_rows)
    result <- rbind(result, temp)
  }
}

# 查看最终结果
print(result)

方法二:tidyverse风格(dplyr+grepl)

如果习惯用tidyverse工具链,可结合rowwise和grepl实现更简洁的匹配:

library(dplyr)
library(tidyr)

result <- meta_df %>%
  rowwise() %>%
  # 筛选出当前real_id匹配的data_df行,存为列表列
  mutate(match_rows = list(filter(data_df, grepl(real_id, raw_id)))) %>%
  # 展开列表列,合并数据
  unnest(match_rows) %>%
  ungroup()

print(result)

扩展:保留无匹配的行

如果需要保留meta_df中所有行(即使在data_df中无匹配),只需在unnest时添加keep_empty = TRUE:

result <- meta_df %>%
  rowwise() %>%
  mutate(match_rows = list(filter(data_df, grepl(real_id, raw_id)))) %>%
  unnest(match_rows, keep_empty = TRUE) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者DaniCee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:07:33