如何匹配两个矩阵公共行名,替换矩阵1的target_id为对应基因名
解决方案:替换矩阵行名为对应基因名
方法1:直接操作矩阵行名(高效简洁)
先模拟你的输入数据(实际使用时替换为你的读入代码,比如read.table/read.csv):
# 模拟矩阵1 mat1 <- matrix(c(-13.8155106, 0.5522234, 0.2745596, 0.260108646, -13.815511, -13.8155106, -13.8155106, -13.8155106, -13.815510558, 5.466629, 0.6350789, 0.1733741, 0.1357635, 0.437655396, -13.815511), nrow = 3, byrow = TRUE, dimnames = list(c("ENSMUST00000221393.2", "ENSMUST00000059802.7", "ENSMUST00000185334.7"), c("KO_1D_7dpi", "KO_2D_7dpi", "KO_3D_7dpi", "KO_4D_7dpi", "WT_1D_7dpi"))) # 模拟矩阵2 mat2 <- data.frame(external_gene_name = c("gene1", "gene2", "gene3"), row.names = c("ENSMUST00000221393.2", "ENSMUST00000059802.7", "ENSMUST00000185334.7"))
利用行名的对应关系直接替换:
# 按mat1的行名顺序提取mat2中的基因名,替换mat1的行名 rownames(mat1) <- mat2[rownames(mat1), "external_gene_name"]
执行后mat1就是你想要的结果。
方法2:用tidyverse框架处理(适合熟悉dplyr的用户)
如果习惯用数据框操作,先将矩阵转为带行名列的数据框,合并后再重置行名:
library(dplyr) library(tibble) mat1_processed <- mat1 %>% # 将矩阵转为保留行名的tibble as_tibble(rownames = "target_id") %>% # 把mat2的行名转为target_id列,再合并 left_join(mat2 %>% rownames_to_column("target_id"), by = "target_id") %>% # 将external_gene_name设为新行名 column_to_rownames("external_gene_name") %>% # 移除多余的target_id列 select(-target_id)
为什么你之前的left_join/lapply没成功?
大概率是因为没有把矩阵的行名转为可用于匹配的列,或者合并后没有将基因名重新设置为行名。上述两种方法都解决了这个问题:方法1直接利用行名匹配,方法2先将行名转为列完成合并,再重置行名。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

