如何在R中合并行数列数不同、含部分共同行名的矩阵?
在R中合并行名重叠、列名唯一的矩阵
针对你需要合并多个行名部分重叠、列名完全唯一的矩阵,并保留原行名、用NA填充缺失值的需求,这里提供两种可行方案:
方案一:Base R原生实现(无需额外包)
这种方法直接通过矩阵索引操作完成,逻辑清晰:
# 定义示例数据(你提供的测试矩阵) data1 <- matrix(seq(1,9), nrow = 3, ncol = 3) rownames(data1) = c("gene1", "gene2", "gene3") colnames(data1) = c("cell1", "cell2", "cell3") data2 <- matrix(seq(1,12), nrow = 4, ncol = 3) rownames(data2) = c("gene2", "gene3", "gene4", "gene5") colnames(data2) = c("cell4", "cell5", "cell6") # 1. 收集所有唯一行名和列名 all_rownames <- unique(c(rownames(data1), rownames(data2))) all_colnames <- c(colnames(data1), colnames(data2)) # 2. 创建空矩阵,初始值为NA,设置行名和列名 merged_matrix <- matrix( NA, nrow = length(all_rownames), ncol = length(all_colnames), dimnames = list(all_rownames, all_colnames) ) # 3. 分别填充两个矩阵的内容到对应位置 merged_matrix[rownames(data1), colnames(data1)] <- data1 merged_matrix[rownames(data2), colnames(data2)] <- data2 # 查看结果 merged_matrix
执行后即可得到目标矩阵:行名包含所有基因,列名包含所有细胞,对应位置填充数值,缺失处为NA。
方案二:使用tidyverse工具包(适合习惯tidy语法的用户)
如果平时常用dplyr等tidyverse包,可以用以下步骤:
library(dplyr) library(tibble) # 1. 将矩阵转为带行名列的tibble data1_tbl <- as_tibble(data1, rownames = "gene") data2_tbl <- as_tibble(data2, rownames = "gene") # 2. 按gene列做全连接,保留所有行 merged_tbl <- full_join(data1_tbl, data2_tbl, by = "gene") # 3. 将gene列转回行名,再转为矩阵 merged_matrix <- merged_tbl %>% column_to_rownames("gene") %>% as.matrix() # 查看结果 merged_matrix
为什么直接用merge函数不行?
merge(data1, data2, all=T)会将矩阵自动转为数据框,且由于两个矩阵没有共同列名,merge会执行笛卡尔积合并,生成大量冗余行,同时丢失原有的行名信息,无法满足需求。
内容的提问来源于stack exchange,提问作者dr_device
相关产品推荐
相关产品推荐

