I want to match/join two matrices, a small one with values should match in a bigger one by rownames/colnames. I only find this answer. However, I cannot match the locations
1) as.data.frame.table Convert the small matrix to the following long form data frame L
having columns Var1
, Var2
and Freq
and then use matrix subscripting to assign the components:
L <- as.data.frame.table(matrix)
full_matrix[as.matrix(L[1:2])] <- L$Freq
giving:
> 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) direct subscripting
full_matrix[rownames(matrix), colnames(matrix)] <- matrix
Note: The two solutions give identical results:
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
See below using R's match function (I renamed your small 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)))
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")))
You can then use:
rowmatch <- match(rownames(small_matrix), rownames(full_matrix))
colmatch <- match(colnames(small_matrix), colnames(full_matrix))
full_matrix[rowmatch, colmatch] <- small_matrix
Which gives you the desired output:
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
Or alternatively, you can use %in%
with slighly different syntax:
full_matrix[rownames(full_matrix) %in% rownames(small_matrix),
colnames(full_matrix) %in% colnames(small_matrix)] <- small_matrix