通过列/行匹配将两个不同维度的矩阵相加

问题描述 投票:0回答:1

我有不同维度的矩阵,例如:

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 <- 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)

我正在尝试添加它们,以便结果中包含其中缺少的变量。

我发现了一篇有用的上一篇文章:如何聚合具有不同维度的矩阵? [R] 并尝试了这些代码,但问题仍然是我的变量名称发生了变化,并且有些变量名称丢失了。

这个代码是最接近的:

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

但是生成的矩阵是 17X17,应该是 18 X 18,因为 b 中缺少 a 的“S”变量,需要将其包含在内,如下所示:

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)
r matrix addition matching
1个回答
0
投票

您可以尝试

aggregate
as.data.frame.table
,如下所示

xtabs(
   Freq ~ .,
   aggregate(
      Freq ~ .,
      do.call(
         rbind,
         lapply(
            list(a, b),
            \(x) as.data.frame.table(as.matrix(x))
         )
      ), sum
   )
)

这给出了

    Var2
Var1 Si N1 N2 A1 A2 A3 A4 A5 Z1 Z2 Z3 Z5 IN M S D O P
  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 1 0 0 0 1
  A2  0  2  2  0  0  0  0  0  0  0  2  1  0 1 0 1 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 0 1 0
  A5  0  2  0  0  0  0  0  1  0  0  0  0  2 0 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 1 0 0 0
  Z3  0  0  0  0  2  0  0  0  0  1  2  0  0 0 0 1 0 0
  Z5  0  0  0  0  1  0  0  0  0  0  0  2  1 0 0 0 0 0
  IN  0  0  0  0  0  0  0  2  0  0  0  1  1 0 0 0 0 0
  M   0  0  0  1  1  0  0  0  0  0  0  0  0 2 0 0 0 1
  S   0  0  0  0  0  0  0  0  0  1  0  0  0 0 1 0 0 0
  D   0  0  0  0  1  0  0  0  0  0  0  0  0 0 0 1 0 0
  O   0  0  0  0  0  0  1  0  0  0  0  0  0 0 0 0 1 0
  P   0  0  0  1  0  0  0  0  0  0  0  0  0 1 0 0 0 0
© www.soinside.com 2019 - 2024. All rights reserved.