R语言比对两个矩阵Samples列 匹配后替换对应值的实现方法
R实现两矩阵Samples列匹配替换
核心逻辑是基于两个矩阵共有的Samples列做键值映射,把matrix2中能匹配到的样本名替换成matrix1对应的Name值,匹配不到的条目保留原样本名即可,不需要额外复杂操作,下面给两种可直接运行的实现方案:
第一步:准备输入数据
实际使用时把这部分替换成你自己读入本地文件的代码即可,先以题目给出的示例数据做演示:
# 构造示例matrix1 matrix1 <- data.frame( Samples = c("ab_745", "cd333", "fn_487", "aa482"), Name = c("jhjf", "kdwo", "asjd", "ijaf"), stringsAsFactors = FALSE ) # 构造示例matrix2 matrix2 <- data.frame( Nr = c(1, 2, 3), Samples = c("cd858", "aa482", "fn_487"), Expr.nr = c(4838.0, 2384.9, 3834.8), stringsAsFactors = FALSE )
操作提示:如果是用read.table/read.csv读本地文件,记得加stringsAsFactors = FALSE参数,避免列被转成因子导致匹配失败;如果读入的是纯matrix类型,先用as.data.frame()转成数据框再操作。
方法1:基础R实现(无需安装第三方包)
用内置的match函数定位匹配位置后直接替换即可,不会打乱matrix2原有的行顺序,是兼容性最好的稳妥写法:
# 定位matrix2每个样本在matrix1中的匹配位置 match_idx <- match(matrix2$Samples, matrix1$Samples) # 匹配成功的条目替换成对应Name,匹配失败的保留原Samples值 matrix2$Samples[!is.na(match_idx)] <- matrix1$Name[na.omit(match_idx)]
运行后得到的matrix2完全符合需求:
Nr Samples Expr.nr 1 1 cd858 4838.0 2 2 ijaf 2384.9 3 3 asjd 3834.8
可以看到aa482被替换成了对应的ijaf,fn_487被替换成了对应的asjd,没有匹配项的cd858保留原值。
方法2:dplyr实现(适合日常用tidyverse处理数据的场景)
如果平时习惯用dplyr做数据处理,左连接后合并列的写法逻辑更直观,运行结果和方法1完全一致:
library(dplyr) matrix2 <- matrix2 %>% left_join(matrix1, by = "Samples") %>% # 优先取匹配到的Name,没匹配到就用原Samples值 mutate(Samples = ifelse(is.na(Name), Samples, Name)) %>% select(-Name) # 删除匹配过程中临时生成的Name列
内容的提问来源于stack exchange,提问作者BerKa
相关产品推荐
相关产品推荐

