根据列名和行名将数据从一个矩阵添加到另一个矩阵

时间:2020-05-15 16:08:37

标签: r matrix

如果我有两个矩阵: 较大的空行包含许多行和列,而较小的空行包含较大行和列的子集,我该如何合并两者,以便将较小行中的值添加到较大行中?

创建数据

my_matrix <- matrix(nrow =7, ncol = 7)
rownames(my_matrix) <- c('a', 'b', 'c', 'd', 'e', 'f', 'g')
colnames(my_matrix) <- c('a', 'b', 'c', 'd', 'e', 'f', 'g')

my_matrix2 <- matrix(1:9, nrow = 3, ncol = 3)
rownames(my_matrix2) <- c('c', 'e', 'g')
colnames(my_matrix2) <- c('c', 'e', 'g')

my_matrix
   a  b  c  d  e  f  g
a NA NA NA NA NA NA NA
b NA NA NA NA NA NA NA
c NA NA NA NA NA NA NA
d NA NA NA NA NA NA NA
e NA NA NA NA NA NA NA
f NA NA NA NA NA NA NA
g NA NA NA NA NA NA NA

 my_matrix2
  c e g
c 1 4 7
e 2 5 8
g 3 6 9

my_matrix
   a  b  c  d  e  f  g
a NA NA NA NA NA NA NA
b NA NA NA NA NA NA NA
c NA NA  1 NA  4 NA  7
d NA NA NA NA NA NA NA
e NA NA  2 NA  5 NA  8
f NA NA NA NA NA NA NA
g NA NA  3 NA  6 NA  9

我可以结合使用reshape2::melt()tidyversereshape2::acast()来做到这一点,但我想知道是否有更有效的管理方式,因为我必须非常大数据集?谢谢

当前方法:

library(tidyverse)
library(reshape2)

my_matrix_df <- melt(my_matrix) 
my_matrix_df2 <- melt(my_matrix2)

tets <- my_matrix_df %>%
  left_join(., my_matrix_df2, by=c('Var1', 'Var2')) %>%
  mutate(
    value = case_when(!is.na(value.y) ~ value.y)
  ) %>% select(1,2,5)

acast(tets,  Var1 ~ Var2)  

1 个答案:

答案 0 :(得分:2)

您可以在索引中引用行和列的名称。

> my_matrix[rownames(my_matrix2), colnames(my_matrix2)] <- my_matrix2
> my_matrix
   a  b  c  d  e  f  g
a NA NA NA NA NA NA NA
b NA NA NA NA NA NA NA
c NA NA  1 NA  4 NA  7
d NA NA NA NA NA NA NA
e NA NA  2 NA  5 NA  8
f NA NA NA NA NA NA NA
g NA NA  3 NA  6 NA  9