R语言中如何实现含相似一致字符串的数据框连接
数据框连接时带“Total”的行业无法匹配编码
问题描述
我在对两个数据框X和Y执行连接操作时遇到困难:X包含行业、子行业及对应支出金额,Y是行业与编码的索引表。当前使用left_join函数连接后,X中如“Total Min”这类包含“Total”的行业行无法匹配到Y中对应行业(如Min)的INDcode。我希望“Min”和“Total Min”都能匹配到INDcode“M”,虽可手动处理或重新计算替换总行,但想寻求更优实现方法,尝试过fuzzyjoin包但未找到合适用法。
示例代码与当前结果
IND<- c("Ag", "Ag", "Total Ag", "Min", "Min", "Min", "Total Min") SubIND<- c("agriculture", "aquaculture", "Total", "gold", "copper", "zinc", "Total") Dollars<-sample(1:100,7) INDcode<-c("A","B","C","D","E","G","H","M","R","Y","Z") INDi<-c("Ag","Bar","Car","Don","Ec","Gl","Hu","Min","Run","Yt","Zal") X <- data.frame(IND,SubIND,Dollars) Y <- data.frame(INDi,INDcode) join<-left_join(X,Y,by=join_by(IND==INDi)) print(join)
当前输出:
IND SubIND Dollars INDcode 1 Ag agriculture 4 A 2 Ag aquaculture 63 A 3 Total Ag Total 35 <NA> 4 Min gold 68 M 5 Min copper 14 M 6 Min zinc 80 M 7 Total Min Total 48 <NA>
解决方案
方法1:预处理提取核心行业名称
通过正则移除"Total "前缀,得到和Y中匹配的行业名称,再执行连接:
library(dplyr) library(stringr) # 预处理X的IND列,移除开头的"Total " X_clean <- X %>% mutate(IND_match = str_remove(IND, "^Total\\s")) # 执行左连接并清理临时列 final_join <- left_join(X_clean, Y, by = join_by(IND_match == INDi)) %>% select(-IND_match) print(final_join)
方法2:使用fuzzyjoin进行正则匹配
利用fuzzyjoin的regex_left_join,匹配IND字段中包含Y的INDi关键词的行:
library(fuzzyjoin) # 正则左连接,匹配IND中包含INDi的情况 final_join <- regex_left_join(X, Y, by = c("IND" = "INDi")) %>% # 去重确保每行只保留正确匹配 group_by(IND, SubIND, Dollars) %>% slice(1) %>% ungroup() print(final_join)
方法3:提取最后一个单词(适用于固定格式)
如果所有带Total的行都是"Total + 行业名"的格式,直接取最后一个单词作为匹配键:
library(dplyr) library(stringr) X_clean <- X %>% mutate(IND_match = word(IND, -1)) final_join <- left_join(X_clean, Y, by = join_by(IND_match == INDi)) %>% select(-IND_match) print(final_join)
预期输出
IND SubIND Dollars INDcode 1 Ag agriculture 4 A 2 Ag aquaculture 63 A 3 Total Ag Total 35 A 4 Min gold 68 M 5 Min copper 14 M 6 Min zinc 80 M 7 Total Min Total 48 M
内容的提问来源于stack exchange,提问作者Gilrob
相关产品推荐
相关产品推荐

