首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式与fuzzyjoin / dplyr匹配

正则表达式与fuzzyjoin / dplyr匹配
EN

Stack Overflow用户
提问于 2020-11-19 22:47:51
回答 1查看 33关注 0票数 0

我有两个数据帧,我想通过第一列连接它们,并忽略大小写:

代码语言:javascript
复制
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)

我想要的是:

代码语言:javascript
复制
df5<- data.frame(A = c("XX28801","ZZ9"), B = c("one","two"), Z = c(NA,"Zz9"), C = c(NA, "four"))

但有趣的是,我使用的是fuzzyjoin包:

代码语言:javascript
复制
join <- regex_left_join(df3,df4,by= c("A" = "Z"), ignore_case = TRUE)

ZZ9和Zz9匹配得很好,但我不知道为什么XX28801会匹配X2880。唯一的相似之处是XX28801中的X2880。

我也不想在连接之前大写/小写这些值,因为我希望列A和列Z保留它们的原始值。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 04:05:49

正则表达式在正则表达式上加入join,这在右手表内的文本中搜索左手表中的文本。因此,当在"XX28801“中找到"X2880”时,这被认为是匹配的。

为了更好地理解正则表达式,您可能会发现使用grepl(pattern, text)探索一些比较很有用,如果在文本中找到模式,它将返回true/false:

代码语言:javascript
复制
> grepl('X2880', 'XX28801', ignore.case = TRUE)
[1] TRUE

似乎您只想在整个文本字符串与整个文本字符串匹配时才进行匹配,而不是大写/小写。为此,我建议您创建要联接的临时列:

代码语言:javascript
复制
df3_w_lower = df3 %>%
  mutate(A_for_join = tolower(A))
df4_w_lower = df4 %>%
  mutate(Z_for_join = tolower(Z))

join = left_join(df3_w_lower, df4_w_lower, by = c("A_for_join" = "Z_for_join")) %>%
  select(-A_for_join, - Z_for_join)

通过使用临时列进行联接,您可以保留原始列中的大小写。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64914070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档