5
votes

How do you populate an empty matrix with the values of another matrix?

The empty matrix:

> m1 <- matrix(ncol=8, nrow=8)
> rownames(m1) <- c('a','b','c','d','e','f','g','h')
> colnames(m1) <- c('a','b','c','d','e','f','g','h')
> m1
   a  b  c  d  e  f  g  h
a NA NA NA NA NA NA NA NA
b NA NA NA NA NA NA NA NA
c NA NA NA NA NA NA NA NA
d NA NA NA NA NA NA NA NA
e NA NA NA NA NA NA NA NA
f NA NA NA NA NA NA NA NA
g NA NA NA NA NA NA NA NA
h NA NA NA NA NA NA NA NA

The matrix with the values to populate the empty matrix:

> m2 <- matrix(ncol=4, nrow=4)
> rownames(m2) <- c('b','e','h','x')
> colnames(m2) <- c('b','e','h','x')
> m2[,'b'] <- c(1,2,3,1)
> m2[,'e'] <- c(2,1,1,5)
> m2[,'h'] <- c(3,1,3,5)
> m2[,'x'] <- c(1,5,5,1)
> m2
  b e h x
b 1 2 3 1
e 2 1 1 5
h 3 1 3 5
x 1 5 5 1

How do you merge the two matrixes to get this result:

   a  b  c  d  e  f  g  h
a NA NA NA NA NA NA NA NA
b NA  1 NA NA  2 NA NA  3
c NA NA NA NA NA NA NA NA
d NA NA NA NA NA NA NA NA
e NA  2 NA NA  1 NA NA  1
f NA NA NA NA NA NA NA NA
g NA NA NA NA NA NA NA NA
h NA  3 NA NA  1 NA NA  3

Edit: added row/col x in m2, which is not in m1

1

1 Answers

9
votes

Find the column (row) names that both matrices have in common

cols <- colnames(m1)[colnames(m1) %in% colnames(m2)]
rows <- rownames(m1)[rownames(m1) %in% rownames(m2)]

Then assign the appropriate values from m2 to m1

m1[rows, cols] <- m2[rows, cols]
m1
#   a  b  c  d  e  f  g  h
#a NA NA NA NA NA NA NA NA
#b NA  1 NA NA  2 NA NA  3
#c NA NA NA NA NA NA NA NA
#d NA NA NA NA NA NA NA NA
#e NA  2 NA NA  1 NA NA  1
#f NA NA NA NA NA NA NA NA
#g NA NA NA NA NA NA NA NA
#h NA  3 NA NA  1 NA NA  3