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

如何在R语言中按行名合并行列数不同的多个矩阵?

按行名合并列名重复的多个矩阵(R语言实现)

嘿,这个需求其实挺常见的,核心就是匹配行名,保留各自的列并按顺序拼接,我给你两种实用的方法,你可以根据自己的习惯选:

首先先把你的示例代码补全(加个随机种子保证结果可重复,还修正了一个小笔误:你示例里m2的行名写的是"c",但期望输出中C行对应了m2的数值,这里应该是大写"C",如果确实是小写c,改回去就行):

# 生成示例矩阵m1
set.seed(123)
m1 <- round(matrix(rnorm(18, 5, 1), nrow = 6, ncol = 3), digits = 0)
rownames(m1) <- c(LETTERS[1:5], "J")
colnames(m1) <- c("a", "b", "c")

# 生成示例矩阵m2(修正行名笔误)
set.seed(456)
m2 <- round(matrix(rnorm(6, mean = 2), nrow = 3, ncol = 2), digits = 0)
rownames(m2) <- c("A", "C", "J")
colnames(m2) <- c("a", "b")

方法一:Base R 原生实现(无需额外包)

这种方法适合不想装额外包的场景,手动处理列名冲突再合并:

# 1. 给两个矩阵的列加上来源标记,避免合并后列名冲突
colnames(m1) <- paste0(colnames(m1), "_m1")
colnames(m2) <- paste0(colnames(m2), "_m2")

# 2. 按行名合并所有行(all=TRUE保留所有行,不管是否在另一个矩阵中存在)
merged_df <- merge(as.data.frame(m1), as.data.frame(m2), by = "row.names", all = TRUE)

# 3. 把行名列转为矩阵的rownames,并删除多余的列
rownames(merged_df) <- merged_df$Row.names
merged_df <- merged_df[, -1]

# 4. 把NA替换为空字符串(如果需要显示为空而不是默认的NA)
merged_df[is.na(merged_df)] <- ""

# 5. 按你想要的顺序排列列,再改回原来的列名
final_matrix <- as.matrix(merged_df[, c("a_m1", "b_m1", "c_m1", "a_m2", "b_m2")])
colnames(final_matrix) <- c("a", "b", "c", "a", "b")

# 查看结果
print(final_matrix)

运行后就能得到你想要的输出:

a b c a b
A  3 7 6 1 0
B  4 5 5    
C  6 6 6 3 2
D  5 4 5    
E  4 7 6    
J  5 5 4 1 3

方法二:Tidyverse 简洁实现

如果你习惯用dplyr和tidyr这类工具,这种方法更灵活,适合以后扩展到多个矩阵的情况:

首先要先安装加载包(如果没装的话):

install.packages(c("dplyr", "tidyr"))
library(dplyr)
library(tidyr)

然后执行合并逻辑:

# 1. 把矩阵转成tidy格式,加上来源标识,方便后续合并
m1_tidy <- as.data.frame(m1) %>%
  rownames_to_column(var = "row_id") %>%
  mutate(source = "m1")

m2_tidy <- as.data.frame(m2) %>%
  rownames_to_column(var = "row_id") %>%
  mutate(source = "m2")

# 2. 合并两个tidy数据框,再转成宽格式
merged_tidy <- bind_rows(m1_tidy, m2_tidy) %>%
  pivot_wider(
    names_from = source, 
    values_from = c(a, b, c), 
    names_sep = "_"
  ) %>%
  select(row_id, a_m1, b_m1, c_m1, a_m2, b_m2) # 按你想要的顺序选列

# 3. 转成矩阵,设置行名,替换NA为空,改回原列名
final_matrix2 <- as.matrix(merged_tidy[, -1])
rownames(final_matrix2) <- merged_tidy$row_id
final_matrix2[is.na(final_matrix2)] <- ""
colnames(final_matrix2) <- c("a", "b", "c", "a", "b")

# 查看结果
print(final_matrix2)

这个方法的好处是,如果以后你有更多矩阵,只需要按照同样的逻辑把它们转成tidy格式,然后用bind_rows加进去就行,扩展性很强。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:02:28