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

在R中基于字符串向量比较字符向量并合并匹配数据框

R列表处理解决方案

问题背景

我有两个R列表A和B,A包含2000-2022年的数据,B包含2023-2030年的数据。两个列表的名称对应以下字符向量:

a <- c("ACC_a_his", "BCC_b_his", "Can_c_his", "CES_d_his")
b <- c("ACC_a_fu", "BCC_b_fu", "Can_c_fu", "CES_d_fu","FGO_c_fu")

另外有一个字符串向量c,是a和b名称中的共同标识:

c <- c("ACC","BCC", "Can", "CES", "FGO")

注意:c中的字符串在文件名中的位置不固定,可能在开头、中间或结尾。

需求1:找出a和b之间的差异项

目标是找出仅存在于a或仅存在于b的名称,预期输出为"FGO_c_fu"。

实现代码

# 定义函数:从名称中提取匹配的标识
get_matched_id <- function(name, id_vec) {
  id_vec[sapply(id_vec, function(x) grepl(x, name))]
}

# 为a和b的每个名称匹配对应的标识
a_matched_ids <- sapply(a, get_matched_id, id_vec = c)
b_matched_ids <- sapply(b, get_matched_id, id_vec = c)

# 找出仅在b中存在的标识,再对应到名称
unique_id <- setdiff(b_matched_ids, a_matched_ids)
diff_name <- names(b_matched_ids)[b_matched_ids == unique_id]

print(diff_name)
# 输出:"FGO_c_fu"

说明

  • 用grepl模糊匹配名称中包含的标识,不受标识位置影响;
  • 通过setdiff找出仅在b中出现的标识,再反向定位到对应的名称。

需求2:按标识合并对应数据框

根据c中的匹配字符串,将A和B中对应的数据框合并,推荐使用更灵活的dplyr::bind_rows替代基础的rbind。

实现代码(基础版)

merged_list <- list()

for (id in c) {
  # 定位A中包含当前标识的数据框
  a_df <- A[grepl(id, names(A))][[1]]
  # 定位B中包含当前标识的数据框
  b_df <- B[grepl(id, names(B))][[1]]
  
  # 合并数据框,处理仅单侧存在的情况
  if (!is.null(a_df) && !is.null(b_df)) {
    merged_list[[id]] <- rbind(a_df, b_df)
  } else if (!is.null(a_df)) {
    merged_list[[id]] <- a_df
  } else if (!is.null(b_df)) {
    merged_list[[id]] <- b_df
  }
}

实现代码(高效灵活版)

library(dplyr)

# 用lapply遍历标识,批量合并
merged_list <- lapply(c, function(id) {
  a_target <- A[grepl(id, names(A))][[1]]
  b_target <- B[grepl(id, names(B))][[1]]
  bind_rows(a_target, b_target)
})

# 给合并后的列表命名
names(merged_list) <- c

说明

  • bind_rows能自动处理列名不一致的情况,缺失列会填充NA,比rbind适用性更广;
  • 最终得到的merged_list以c中的标识为名称,每个元素是对应合并后的数据框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:31:21