R语言按ID合并多个行数不同数据集并删除不匹配行的方法
R 多数据集按公共ID合并解决方案
已知错误原因
你之前的代码报错核心是两个写法问题:
- 调用
Reduce时错误将by = "P_ID"放入了数据集列表中,导致合并函数接收到的参数不是数据框,触发列匹配错误 - 错误设置
merge的by = "col.names"参数,该参数仅用于按行名合并的场景,你的合并键是明确的P_ID列,不需要使用该配置
方案1:基础R实现(无需安装额外包)
步骤1:整理所有待合并数据集到列表
# 所有需要合并的20+数据集都放到这个列表中即可 df_list <- list(df1, df2, df3, df4, df5, df6)
步骤2:定义合并函数并迭代合并
# 按P_ID取两个数据集的交集合并,自动删除ID不匹配的行 MyMerge <- function(x, y) { merge(x, y, by = "P_ID", all = FALSE) } # 迭代合并列表中所有数据集 All.data <- Reduce(MyMerge, df_list)
注:
all = FALSE等价于all.x = F, all.y = F,会仅保留两个输入数据集都存在的P_ID行,迭代多次后最终仅保留出现在所有数据集里的参与者ID,完全符合你的需求。如果存在P_ID外的重名列,可以在merge中添加suffixes参数区分,例:merge(x, y, by = "P_ID", all = FALSE, suffixes = c("_df1", "_df2"))
方案2:tidyverse极简实现(代码更简洁)
如果你使用dplyr生态的工具,可以直接用purrr::reduce + dplyr::inner_join实现,无需自定义函数:
library(dplyr) library(purrr) # 直接按P_ID取所有数据集的交集合并 All.data <- reduce(df_list, inner_join, by = "P_ID")
结果验证
合并后可以运行以下代码验证结果正确性:
- 验证无重复参与者ID:
any(duplicated(All.data$P_ID)),返回FALSE即为正常 - 验证列数符合预期:
ncol(All.data)等于所有数据集列数总和减去(数据集数量-1)*1(减去重复的P_ID列)
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

