如果我有两个矩阵: 较大的空行包含许多行和列,而较小的空行包含较大行和列的子集,我该如何合并两者,以便将较小行中的值添加到较大行中?
创建数据
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()
,tidyverse
和reshape2::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)
答案 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