我有不同维度的矩阵,例如:
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)
您可以尝试
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