R: 正则连接/模糊连接 - 连接不完全匹配的字符串,即使它们的单词顺序不同。

3

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")

我想将df2的c列使用字符串'Apple'、'Sock'和'Mouse Dog'添加到df1中。

我尝试使用regex_joinfuzzyjoin,但似乎字符串的顺序很重要,而且似乎找不到解决方法。

1个回答

4
“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

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


谢谢,我马上就接受它。在此之前有个问题:我用逗号代替了“|”,但它没有起作用——是或操作符使它起作用的,对吗? - rsylatian
1
@rsylatian,确实!在正则表达式中,管道符“|”代表OR运算符。因此,“Mouse|Dog”的意思是:匹配“Mouse”或“Dog”。由于可以编写正则表达式模式,这确实是一个强大的功能,也可以处理更复杂的情况。 - Julius Vainora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接