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

R语言如何合并列表中ID相同且行数一致的多个dataframe

实现同ID同行数DataFrame合并的方案

原有代码问题

  • 循环中使用i++会多次修改索引值,导致索引跳转混乱,出现遗漏或重复处理列表元素的问题
  • 直接对整列ID做相等判断,属于逐行比较逻辑,不能用来判定两个DataFrame是否属于同一个ID分组
  • 直接使用merge按ID合并时,单个ID对应多行的场景会生成笛卡尔积,行数会翻倍,不符合需求
  • 没有对合并结果做存储,也没有按ID统一分组处理所有同ID的DataFrame

实现代码(纯Base R,无需额外依赖)

# --------------------------
# 模拟你的输入数据,可替换成你自己的df列表
df1_ID1 <- data.frame(ID = c(1,1,1), b = c("x","y","z"), c = c("y","z","x"), d = c("z","x","y"))
df2_ID1 <- data.frame(ID = c(1,1,1), b = c("x","y","z"), c = c("y","z","x"), d = c("z","x","y"))
df3_ID2 <- data.frame(ID = c(2,2,2), b = c("x","y","z"), c = c("y","z","x"), d = c("z","x","y"))
df_list <- list(df1_ID1, df2_ID1, df3_ID2)
# --------------------------

# 1. 按每个DataFrame的唯一ID值对列表元素分组
grouped_df <- split(df_list, sapply(df_list, function(x) unique(x$ID)))

# 2. 遍历每个ID分组完成合并
result <- lapply(grouped_df, function(df_group) {
  # 检查同组所有DataFrame行数是否一致,不一致则跳过该分组
  row_counts <- sapply(df_group, nrow)
  if (length(unique(row_counts)) != 1) {
    return(NULL)
  }
  # 合并逻辑:保留第一个DataFrame的ID列,其余df去掉ID列后按列拼接
  merged_df <- df_group[[1]]
  for (i in 2:length(df_group)) {
    merged_df <- cbind(merged_df, df_group[[i]][, setdiff(colnames(df_group[[i]]), "ID")])
  }
  return(merged_df)
})

# 3. 过滤掉行数不一致的无效分组
result <- Filter(Negate(is.null), result)

结果说明

运行完成后,result是按ID命名的列表,比如你示例中的ID1合并结果可以通过result[["1"]]获取,输出和你要求的预期完全一致:

ID b c d b c d
1  1 x y z x y z
2  1 y z x y z x
3  1 z x y z x y

内容的提问来源于stack exchange,提问作者Mrs. PDM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:15:03