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

如何合并行数不同且含行名的多个R数据集?

带行名的多个R数据集合并解决方案

原始数据集

df1 <- data.frame(value_1 = c(1,2,3,4), row.names = c("A", "B", "C", "D"))
df2 <- data.frame(value_2 = c(1,2,3,4,5), row.names = c("A", "B", "C", "D", "E"))
df3 <- data.frame(value_3 = c(1,2,3), row.names = c("A", "D", "E"))
df4 <- data.frame(value_4 = c(5, 6, 7, 8), row.names = c("A", "C", "D", "E"))

原有方法的问题分析

  • 方法1报错原因:使用row.names=NULL删除了行名,此时by=0(按行号合并)失去了对应的匹配依据,导致merge无法识别合并键,抛出错误。
  • 方法2重复值问题:未指定合并键时,merge会自动尝试按所有相同列名合并,但数据集间无共同列名,最终会生成所有行的笛卡尔积,导致值重复。

正确合并方法

方法1:基础R实现(手动转行名为列)

先将每个数据集的行名转为显式列,再以该列为键合并:

# 给每个数据集添加行名列
df1$id <- rownames(df1)
df2$id <- rownames(df2)
df3$id <- rownames(df3)
df4$id <- rownames(df4)

# 递归合并所有数据集,指定合并键为id
merged_df <- Reduce(function(x, y) merge(x, y, by = "id", all = TRUE), list(df1, df2, df3, df4))

# 可选:将id列还原为行名
rownames(merged_df) <- merged_df$id
merged_df$id <- NULL

方法2:tidyverse工具链实现(更简洁)

利用purrr和dplyr的函数简化操作:

library(purrr)
library(tibble)
library(dplyr)

merged_df <- list(df1, df2, df3, df4) %>%
  # 将每个数据集的行名转为id列
  map(rownames_to_column, var = "id") %>%
  # 全连接所有数据集,以id为键
  reduce(full_join, by = "id") %>%
  # 可选:将id列还原为行名
  column_to_rownames(var = "id")

两种方法最终都会得到包含所有行名(A-E)、对应列值匹配、缺失值填充为NA的合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:36:44