如何匹配不同数据表的列并提取对应值?R语言技术求助
解决R中匹配两个DataFrame相似列并提取对应值的问题
你遇到的问题是想用if语句做向量级别的匹配,但if是标量判断工具,没法直接处理整列的匹配逻辑,所以代码跑不起来。下面给你一个简单可行的方案,完全能得到你想要的输出:
第一步:先复现你的示例数据
首先把你的Data_1和Data_2用代码创建出来(方便后续测试):
Data_1 <- data.frame( Var1 = c("chr22:17400000-17410000", "chr22:17400000-17410000", "chr22:33470000-33480000"), Var2 = c("chr22:16080000-16090000", "chr22:26080000-26090000", "chr22:16080000-16090000"), value = c(139.939677, 256.945265, 134.432441), stringsAsFactors = FALSE ) Data_2 <- data.frame( coor = c("chr22:17400000-17410000", "chr22:33470000-33480000", "chr22:16080000-16090000", "chr22:26080000-26090000"), ID = c(1,2,3,4), stringsAsFactors = FALSE )
第二步:用match()实现向量匹配
match()函数专门用来处理向量级别的匹配,它会对Data_1$Var1和Data_1$Var2的每个元素,在Data_2$coor里找到对应的位置,然后提取出对应的ID值:
# 给Data_1添加ID1列:匹配Var1对应的ID Data_1$ID1 <- Data_2$ID[match(Data_1$Var1, Data_2$coor)] # 给Data_1添加ID2列:匹配Var2对应的ID Data_1$ID2 <- Data_2$ID[match(Data_1$Var2, Data_2$coor)] # 整理成你想要的输出格式 output <- Data_1[, c("ID1", "ID2", "value")]
最终输出结果
运行上面的代码后,output就是你期望的结果:
> output ID1 ID2 value 1 1 3 139.93968 2 1 4 256.94527 3 2 3 134.43244
为什么你的原代码不行?
你之前用的if()和else if()是标量判断工具——当你传入一个逻辑向量(比如Data_1$Var1 %in% Data_2$coor会返回c(TRUE, TRUE, TRUE)),它只会取向量的第一个元素来判断,没法实现逐行匹配的需求。而match()是向量级别的函数,正好对应你需要的逐元素匹配场景。
内容的提问来源于stack exchange,提问作者star
相关产品推荐
相关产品推荐

