您可以使用Merge并指定也要使用row.names
进行合并.
combined_adj <- merge(x = adj1,
y = adj2,
by = c('row.names',
intersect(colnames(adj1),
colnames(adj2))
),
all = TRUE
)
combined_adj
Row.names g1 g2 g3 g5 g6 g4
1 John 0 0 0 0 0 0
2 Mary 0 NA NA NA NA 0
3 Paolo 0 NA NA NA NA 0
4 Sarah 0 0 0 0 0 NA
5 Tim 0 0 0 0 0 0
这会将其转换为data.Frame,因此如果需要,您需要将其转换回矩阵.
row.names(combined_adj) <- combined_adj[,1]
combined_adj <- combined_adj[,-1]
编辑:合并多个矩阵
我们使用Reduce
将其应用于所有矩阵.但是,我们首先将其转换为data.Frame,并创建一个包含ROW_NAMES的列以简化操作.
# create sample data
adj1 <- matrix(
0, 3, 5,
dimnames = list(c("Tim", "John", "Sarah"),
c("g1", "g2", "g3", "g5", "g6"))
)
adj2 <- matrix(
0, 4, 2,
dimnames = list(c("Tim", "Mary", "John", "Paolo"),
c("g1", "g4"))
)
adj3 <- matrix(
0, 3, 3,
dimnames = list(c("Tim2", "Mary2", "John"), c("g1", "g4", 'g7'))
)
# create a list
list_matrices <- list(adj1, adj2, adj3)
# convert to dataframes and create a column with row.names
list_matrices <- lapply(list_matrices, function(mat){
mat <- as.data.frame(mat)
mat$row_names <- row.names(mat)
mat
})
# successively combine them, merge 1..2 and then merge result with 3 and so on
res <- Reduce(function(mat1, mat2) merge(mat1, mat2, all = TRUE), x = list_matrices)
res
g1 row_names g4 g2 g3 g5 g6 g7
1 0 John 0 0 0 0 0 0
2 0 Mary 0 NA NA NA NA NA
3 0 Mary2 0 NA NA NA NA 0
4 0 Paolo 0 NA NA NA NA NA
5 0 Sarah NA 0 0 0 0 NA
6 0 Tim 0 0 0 0 0 NA
7 0 Tim2 0 NA NA NA NA 0