You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:37:49