R:如何匹配/连接不同维度的2个矩阵(nrow/ncol)?

N.V*_*ela 4 r

我想匹配/加入两个矩阵,一个小值的值应该通过rownames/colnames匹配更大的矩阵.我只找到了这个答案.但是,我无法匹配位置,因为代码行在frn <- as.matrix(bigMatrix[[1]])我的情况下不起作用.内,外...加入的答案,在这里并没有帮助,因为我想匹配/加入了很多不同的列(而不是如用于X CostumerID和y的一个客户ID).

因为我使用的矩阵是126x104和193x193矩阵.我准备了示例数据:1.较大的矩阵,其中应包括较小的矩阵(字母在原始数据集国家名称中):

a = c("A", "B", "C", "D", "E", "F")
full_matrix = matrix(nrow = length(a), ncol=length(a))
dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)))

full_matrix
   A  B  C  D  E  F
A NA NA NA NA NA NA
B NA NA NA NA NA NA
C NA NA NA NA NA NA
D NA NA NA NA NA NA
E NA NA NA NA NA NA
F NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)

而较小的矩阵:

matrix = matrix(c(2, 4, 3, 1, 5, 7, 3, 1, 6), nrow=3, ncol=3)
dimnames(matrix) <- list(c("B","C","E"), c("A","B","F"))

matrix
  A B F
B 2 1 3
C 4 5 1
E 3 7 6
Run Code Online (Sandbox Code Playgroud)

结果看起来应该是这样的:

   A  B  C  D  E  F
A NA NA NA NA NA NA
B  2  1 NA NA NA  3
C  4  5 NA NA NA  1
D NA NA NA NA NA NA
E  3  7 NA NA NA  6
F NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 6

1)as.data.frame.table转换小矩阵以下长形式的数据帧L具有列Var1,Var2Freq然后使用矩阵的下标指定的组件:

L <- as.data.frame.table(matrix)
full_matrix[as.matrix(L[1:2])] <- L$Freq
Run Code Online (Sandbox Code Playgroud)

赠送:

> full_matrix
   A  B  C  D  E  F
A NA NA NA NA NA NA
B  2  1 NA NA NA  3
C  4  5 NA NA NA  1
D NA NA NA NA NA NA
E  3  7 NA NA NA  6
F NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)

2)直接下标

full_matrix[rownames(matrix), colnames(matrix)] <- matrix
Run Code Online (Sandbox Code Playgroud)

注意: 这两个解决方案给出相同的结果:

a = c("A", "B", "C", "D", "E", "F")
full_matrix = matrix(nrow = length(a), ncol=length(a))
dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)))
matrix = matrix(c(2, 4, 3, 1, 5, 7, 3, 1, 6), nrow=3, ncol=3)
dimnames(matrix) <- list(c("B","C","E"), c("A","B","F"))

fm1 <- full_matrix
L <- as.data.frame.table(matrix)
fm1[as.matrix(L[1:2])] <- L$Freq

fm2 <- full_matrix
fm2[rownames(matrix), colnames(matrix)] <- matrix

identical(fm1, fm2)
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)