在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
相关产品推荐
相关产品推荐

