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

时间:2015-06-25 12:44:32

标签: r

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

由于我使用的矩阵是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

较小的矩阵:

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

结果应如此:

   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

2 个答案:

答案 0 :(得分:6)

1)as.data.frame.table 将小矩阵转换为包含L列,Var1和{的列的长格式数据框Var2 {1}}然后使用矩阵下标来分配组件:

Freq

,并提供:

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

2)直接下标

> 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

注意:两种解决方案的结果相同:

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

答案 1 :(得分:3)

使用R&#39的匹配功能(我重命名您的小矩阵)见下文:

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

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

然后您可以使用:

rowmatch <- match(rownames(small_matrix), rownames(full_matrix))
colmatch <- match(colnames(small_matrix), colnames(full_matrix))
full_matrix[rowmatch, colmatch] <- small_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

或者,您可以使用%in%语法略有不同:

full_matrix[rownames(full_matrix) %in% rownames(small_matrix), 
            colnames(full_matrix) %in% colnames(small_matrix)] <- small_matrix