gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:59:14 26 4
gpt4 key购买 nike

我想匹配/连接两个矩阵,一个带有值的小矩阵应该通过 rownames/colnames 匹配一个更大的矩阵。我只找到this回答。但是,我无法将位置匹配为代码行 frn <- as.matrix(bigMatrix[[1]])在我的情况下不起作用。内、外的答案……加入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

最佳答案

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

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 个不同维度的矩阵(nrow/ncol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31050787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com