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

R语言按ID合并多个行数不同数据集并删除不匹配行的方法

R 多数据集按公共ID合并解决方案

已知错误原因

你之前的代码报错核心是两个写法问题:

  1. 调用Reduce时错误将by = "P_ID"放入了数据集列表中,导致合并函数接收到的参数不是数据框,触发列匹配错误
  2. 错误设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:27:04