在R语言中基于Block键实现跨数据表的Lookup(查找匹配)操作
在R语言中按Block匹配两个数据表的Tax列
这事儿在R里有两种常用的办法,我给你一步步讲清楚,连示例代码都给你写好了,直接就能跑!
首先咱们先把你给的示例数据造出来,这样你可以直接复现场景,测试结果:
# 创建数据表1 df1 <- data.frame( country = c("bangladesh", "bangladesh", "bangladesh"), region = c("south", "south", "north"), area = c("block1", "block1", "block12"), houseno = c("C1", "C2", "C2"), stringsAsFactors = FALSE # 避免因子类型带来的不必要麻烦 ) # 创建数据表2 df2 <- data.frame( Area = c("block1", "block2", "block3"), Tax = c(50, 30, 40), muncipality = c("F1", "F2", "F1"), stringsAsFactors = FALSE )
方法1:基础R自带的merge()函数
基础R不用额外装包就能搞定,用merge()函数就行。这里要注意两个表的关联键列名不一样(表1是area,表2是Area),而且咱们要保留表1的所有行,所以得加上all.x = TRUE参数:
# 执行左连接,把表2的Tax匹配到表1对应行 merged_df <- merge(df1, df2, by.x = "area", by.y = "Area", all.x = TRUE) # 查看合并后的结果 print(merged_df)
运行后你会看到:表1里的block12因为在表2找不到对应记录,所以Tax和muncipality列会显示为NA,这完全符合咱们要保留表1所有行的需求。
方法2:tidyverse生态的left_join()函数
如果你平时习惯用tidyverse的语法,dplyr包里的left_join()会更直观,代码可读性也更高。要是还没装tidyverse,先运行install.packages("tidyverse")装一下:
library(tidyverse) # 用管道符串联操作,执行左连接 merged_df <- df1 %>% left_join(df2, by = c("area" = "Area")) # 查看结果 print(merged_df)
这个方法的结果和基础R的merge完全一样,left_join()默认就会保留左表(也就是df1)的所有行,匹配右表(df2)的对应数据,不匹配的行自动填充NA。而且后续如果还要做数据清洗、筛选之类的操作,直接用管道符%>%接着写就行,非常方便。
小提醒
一定要注意两个表的关联键列名大小写不一样!要是没指定by.x/by.y或者by = c("area" = "Area"),R会因为找不到同名列而关联失败,这点别踩坑哦。
内容的提问来源于stack exchange,提问作者rprogrammer
相关产品推荐
相关产品推荐

