【问题标题】:R: How to match/join 2 matrices of different dimensions (nrow/ncol)?R:如何匹配/加入 2 个不同维度的矩阵(nrow/ncol)?
【发布时间】:2015-09-12 02:03:42
【问题描述】:

我想匹配/连接两个矩阵,一个带有值的小矩阵应该通过行名/列名匹配一个更大的矩阵。我只找到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

【问题讨论】:

  • fix_rc(list(matrix), factors = list(LETTERS[1:6], LETTERS[1:6])) 看到这个question/answer。唯一的区别是您的矩阵不在列表中,因此您可以调整它

标签: r


【解决方案1】:

1) as.data.frame.table 将小矩阵转换为以下长格式数据框L 具有列Var1Var2Freq,然后使用矩阵下标分配组件:

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

给予:

> 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

2) 直接下标

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

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

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

【讨论】:

  • 第一个解决方案效果很好,谢谢。然而,第二个检索相同的(小)“矩阵”。
  • 我不知道您所说的“检索相同的(小)“矩阵””是什么意思,但是这两种解决方案给出了相同的结果。我添加了一个带有自包含代码的注释(只需复制并粘贴到一个新的 R 会话中)显示这一点。
【解决方案2】:

使用 R 的匹配函数见下文(我重命名了你的小矩阵):

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

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多