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

如何在R中对行列匹配的不同维度矩阵求和并保留所有变量

问题

我有两个不同维度的矩阵:

矩阵a:

a <- read.table(text = "
   Si N1 N2 A1 A2 A3 A4 A5 Z1 Z2 Z3 Z5 IN M S
Si  1  0  0  0  0  1  0  0  0  0  0  0  0 0 0
N1  0  1  0  1  1  1  1  1  0  0  0  0  0 0 0
N2  0  0  1  0  1  0  0  0  0  0  0  0  0 0 0
A1  0  1  0  0  0  0  0  0  0  1  0  0  0 0 0
A2  0  1  1  0  0  0  0  0  0  0  1  1  0 1 0
A3  1  1  0  0  0  0  0  0  1  0  0  0  0 0 0
A4  0  1  0  0  0  0  1  0  0  0  0  0  0 0 0
A5  0  1  0  0  0  0  0  0  0  0  0  0  1 0 0
Z1  0  0  0  0  0  1  0  0  1  0  0  0  0 0 0
Z2  0  0  0  1  0  0  0  0  0  0  0  0  0 0 1
Z3  0  0  0  0  1  0  0  0  0  0  1  0  0 0 0
Z5  0  0  0  0  1  0  0  0  0  0  0  1  0 0 0
IN  0  0  0  0  0  0  0  1  0  0  0  0  1 0 0
M   0  0  0  0  1  0  0  0  0  0  0  0  0 1 0
S   0  0  0  0  0  0  0  0  0  1  0  0  0 0 1
", header = TRUE)

矩阵b:

b <- read.table(text = "
   Si N1 N2 A1 A2 A3 A4 A5 Z1 Z2 Z3 Z5 D IN M O P
Si  1  0  0  0  0  1  0  0  0  0  0  0 0  0 0 0 0
N1  0  1  0  1  1  1  1  1  0  0  0  0 0  0 0 0 0
N2  0  0  1  0  1  0  0  0  0  0  0  0 0  0 0 0 0
A1  0  1  0  0  0  0  0  0  0  1  0  0 0  0 1 0 1
A2  0  1  1  0  0  0  0  0  0  0  1  0 1  0 0 0 0
A3  1  0  0  0  0  0  0  0  1  0  0  0 0  0 0 0 0
A4  0  1  0  0  0  0  1  0  0  0  0  0 0  0 0 1 0
A5  0  1  0  0  0  0  0  1  0  0  0  0 0  1 0 0 0
Z1  0  0  0  0  0  1  0  0  1  1  0  0 0  0 0 0 0
Z2  0  0  0  1  0  0  0  0  0  1  0  0 0  0 0 0 0
Z3  0  0  0  0  1  0  0  0  0  1  1  0 1  0 0 0 0
Z5  0  0  0  0  0  0  0  0  0  0  0  1 0  1 0 0 0
D   0  0  0  0  1  0  0  0  0  0  0  0 1  0 0 0 0
IN  0  0  0  0  0  0  0  1  0  0  0  1 0  0 0 0 0
M   0  0  0  1  0  0  0  0  0  0  0  0 0  0 1 0 1
O   0  0  0  0  0  0  1  0  0  0  0  0 0  0 0 1 0
P   0  0  0  1  0  0  0  0  0  0  0  0 0  0 1 0 0
", header = TRUE)

我需要将它们相加,同时保留两个矩阵中所有缺失的行和列。之前尝试的代码得到17×17的矩阵,但预期是18×18(矩阵a中的S在b中缺失,需要保留),预期结果如下:

c <- read.table(text = "
   Si N1 N2 A1 A2 A3 A4 A5 Z1 Z2 Z3 Z5 D IN M O P S
Si  2  0  0  0  0  2  0  0  0  0  0  0 0  0 0 0 0 0
N1  0  2  0  2  2  2  2  2  0  0  0  0 0  0 0 0 0 0
N2  0  0  2  0  2  0  0  0  0  0  0  0 0  0 0 0 0 0
A1  0  2  0  0  0  0  0  0  0  2  0  0 0  0 1 0 1 0
A2  0  2  2  0  0  0  0  0  0  0  2  2 1  0 1 0 0 0
A3  2  1  0  0  0  0  0  0  2  0  0  0 0  0 0 0 0 0
A4  0  2  0  0  0  0  2  0  0  0  0  0 0  0 0 1 0 0
A5  0  2  0  0  0  0  0  1  0  0  0  0 0  2 0 0 0 0
Z1  0  0  0  0  0  2  0  0  2  1  0  0 0  0 0 0 0 0
Z2  0  0  0  2  0  0  0  0  0  1  0  0 0  0 0 0 0 1
Z3  0  0  0  0  2  0  0  0  0  1  2  0 1  0 0 0 0 0
Z5  0  0  0  0  2  0  0  0  0  0  0  2 0  1 0 0 0 0
D   0  0  0  0  1  0  0  0  0  0  0  0 1  0 0 0 0 0
IN  0  0  0  0  0  0  0  2  0  0  0  1 0  1 0 0 0 0
M   0  0  0  1  1  0  0  0  0  0  0  0 0  0 1 0 1 0
O   0  0  0  0  0  0  1  0  0  0  0  0 0  0 0 1 0 0
P   0  0  0  1  0  0  0  0  0  0  0  0 0  0 1 0 0 0
S   0  0  0  0  0  0  0  0  0  1  0  0 0  0 0 0 0 1
", header = TRUE)

之前的代码如下,但无法得到预期结果:

sum_mat = function(a, b){
  temp = matrix(data = 0, nrow = max(nrow(a), nrow(b)), ncol = max(ncol(a), ncol(b)))
  temp_a = temp
  temp_a[1:nrow(a), 1:ncol(a)] = a
  temp_b = temp
  temp_b[1:nrow(b), 1:ncol(b)] = b
  temp_a + temp_b
}

c = sum_mat(a, b)

c

请问如何修改代码实现预期的矩阵求和效果?

解决方案

原代码的问题在于只按行列数量填充数据,没有匹配行名和列名,导致缺失的行/列无法被正确保留。修改后的函数需要先统一行和列的全集,再按名称匹配填充数据:

sum_mat <- function(a, b) {
  # 获取所有行名和列名的全集
  all_rows <- union(rownames(a), rownames(b))
  all_cols <- union(colnames(a), colnames(b))
  
  # 创建带名称的全零矩阵,行和列为全集
  temp_a <- matrix(0, nrow = length(all_rows), ncol = length(all_cols),
                   dimnames = list(all_rows, all_cols))
  temp_b <- temp_a  # 复制相同结构的全零矩阵
  
  # 按行名和列名匹配,填充原矩阵的数据
  temp_a[rownames(a), colnames(a)] <- as.matrix(a)
  temp_b[rownames(b), colnames(b)] <- as.matrix(b)
  
  # 求和后转换为data.frame格式,保持原数据结构
  as.data.frame(temp_a + temp_b)
}

# 调用函数得到结果
c <- sum_mat(a, b)

代码说明

  1. 获取全集:用union()函数获取两个矩阵所有行名和列名的并集,确保不丢失任何变量;
  2. 初始化矩阵:基于全集创建带有行名和列名的全零矩阵,保证行和列的顺序包含所有变量;
  3. 匹配填充:通过行名和列名的索引,将原矩阵的数据精准填充到对应位置,避免按位置填充导致的错位;
  4. 求和转换:矩阵求和后转换为data.frame格式,保持与原数据一致的结构。

运行后得到的结果就是预期的18×18矩阵,所有缺失的行(如S)和列(如D、O、P)都会被保留,且对应位置的数据正确相加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:38:14