首页 > 解决方案 > R:Regex_Join/Fuzzy_Join - 以不同的词序加入不精确的字符串

问题描述

df1

在此处输入图像描述

df2

在此处输入图像描述

df3

在此处输入图像描述

library(dplyr)
library(fuzzyjoin)
df1  <- tibble(a =c("Apple Pear Orange", "Sock Shoe Hat", "Cat Mouse Dog"))
df2  <- tibble(b =c("Kiwi Lemon Apple", "Shirt Sock Glove", "Mouse Dog"),
               c = c("Fruit", "Clothes", "Animals"))
# Appends 'Animals'
df3 <-  regex_left_join(df1,df2, c("a" = "b"))
# Appends Nothing
df3 <-  stringdist_left_join(df1, df2,  by = c("a" = "b"), max_dist = 3, method = "lcs")

我想使用字符串“Apple”、“Sock”和“Mouse Dog”将 df2 的 c 列附加到 df1。

我尝试使用regex_joinblurjoin执行此操作,但字符串的顺序似乎很重要,并且似乎找不到解决方法。

标签: rregexstring-matchingfuzzyjoin

解决方案


regex_left_join有效,但它不仅仅是在寻找任何相似之处。正如描述中所说,

通过另一个表中的正则表达式列连接具有字符串列的表

所以,我们需要提供一个正则表达式模式。如果df2$b包含单独的感兴趣的单词,我们可能会这样做

(df2$regex <- gsub(" ", "|", df2$b))
# [1] "Kiwi|Lemon|Apple" "Shirt|Sock|Glove" "Mouse|Dog"      

接着

regex_left_join(df1, df2, by = c(a = "regex"))[-ncol(df1) - ncol(df2)]
# A tibble: 3 x 3
#   a                 b                c      
#   <chr>             <chr>            <chr>  
# 1 Apple Pear Orange Kiwi Lemon Apple Fruit  
# 2 Sock Shoe Hat     Shirt Sock Glove Clothes
# 3 Cat Mouse Dog     Mouse Dog        Animals

where-ncol(df1) - ncol(df2)只需删除包含正则表达式模式的最后一列。


推荐阅读