fuzzyjoin regex_left_join匹配异常:非预期字符串匹配问题求助
解决方案:忽略大小写的完全匹配连接(保留原始列大小写)
我明白你的问题——regex_left_join默认是部分正则匹配,只要字符串中包含匹配的子串就会连接,这就是为什么XX28801会和X2880意外匹配(忽略大小写后,X2880是XX28801的子串)。你需要的是忽略大小写的完全匹配,同时保留A和Z列的原始大小写,下面给你两种可行的方法:
方法1:使用fuzzyjoin自定义匹配函数
我们可以通过match_fun参数传入一个自定义函数,直接判断两列值忽略大小写后是否完全相等,替代默认的部分正则匹配:
library(fuzzyjoin) library(dplyr) # 原始数据框 df3 <- data.frame("A" = c("XX28801","ZZ9"), "B" = c("one","two"), stringsAsFactors = FALSE) df4 <- data.frame("Z" = c("X2880","Zz9"),"C" = c("three", "four"), stringsAsFactors = FALSE) # 执行忽略大小写的完全匹配左连接 join_result <- regex_left_join( df3, df4, by = c("A" = "Z"), match_fun = function(x, y) tolower(x) == tolower(y) ) # 查看结果 print(join_result)
运行结果和你期望的df5完全一致:
A B Z C 1 XX28801 one <NA> <NA> 2 ZZ9 two Zz9 four
方法2:使用dplyr临时小写列连接
如果你更习惯用基础的dplyr操作,可以先给两个数据框添加临时的小写列,连接后再删除临时列,同样能保留原始列的大小写:
library(dplyr) # 添加临时小写列 df3_temp <- df3 %>% mutate(A_lower = tolower(A)) df4_temp <- df4 %>% mutate(Z_lower = tolower(Z)) # 按临时列连接,再移除临时列 join_result <- df3_temp %>% left_join(df4_temp, by = c("A_lower" = "Z_lower")) %>% select(-A_lower, -Z_lower) # 查看结果 print(join_result)
这个方法也会得到和你预期一致的结果,优点是不需要依赖fuzzyjoin包,只用dplyr就能实现。
内容的提问来源于stack exchange,提问作者karuno
相关产品推荐
相关产品推荐

