前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fuzzyjoin实现模糊匹配连接

fuzzyjoin实现模糊匹配连接

作者头像
医学和生信笔记
发布2023-08-30 13:08:54
2140
发布2023-08-30 13:08:54
举报

fuzzyjoin包是dplyr连接操作的变体,它可以支持模糊(匹配)连接,比如忽略单词之间的大小写,根据正则表达式进行连接,忽略单词的拼写错误等。

该包中的函数命名也很简单易懂,对于六个dplyrjoin操作的每个变体,只要在前面加上统一的前缀即可,比如,根据正则表达式进行连接:

  • regex_inner_join
  • regex_left_join
  • regex_right_join
  • regex_full_join
  • regex_semi_join
  • regex_anti_join

除此之外,还有以下前缀:

  • stringdist_
  • difference_
  • distance_
  • geo_
  • interval_

安装

代码语言:javascript
复制
install.packages("fuzzyjoin")
#或者
devtools::install_github("dgrtwo/fuzzyjoin")

忽略大小写的连接

默认的dplyr中的各种连接不支持忽略大小写的连接。但是fuzzyjoin支持。

代码语言:javascript
复制
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(fuzzyjoin)

随便准备两个数据框,里面的大小写不一样:

代码语言:javascript
复制
df1 <- data.frame(a = c("AAB","aBa","AppLe","BANaNa"),
                  b = c("1A","CCC2b","DDE","2R5s")
                  )
df1
##        a     b
## 1    AAB    1A
## 2    aBa CCC2b
## 3  AppLe   DDE
## 4 BANaNa  2R5s

df2 <- data.frame(a = c("aaB","AbA","orange","juice"),
                  d = c("ss","dd","dds","ddff")
                  )
df2
##        a    d
## 1    aaB   ss
## 2    AbA   dd
## 3 orange  dds
## 4  juice ddff

此时如果使用inner_join得不到任何结果:

代码语言:javascript
复制
inner_join(df1,df2,by="a")
## [1] a b d
## <0 rows> (or 0-length row.names)

但是regex_inner_join就可以实现连接:

代码语言:javascript
复制
regex_inner_join(df1,df2,by="a",ignore_case=T)
##   a.x     b a.y  d
## 1 AAB    1A aaB ss
## 2 aBa CCC2b AbA dd

但其实这个函数是根据正则表达式进行连接的,它的功能远不止此,大家感兴趣可以查看包的帮助文档。

根据距离连接

可以忽略某些单词的拼写错误、空格、标点符号等。

准备一个数据框:

代码语言:javascript
复制
library(dplyr)
library(fuzzyjoin)
data(misspellings)

set.seed(2016)
sub_misspellings <- misspellings %>%
  sample_n(10)

sub_misspellings
## # A tibble: 10 × 2
##    misspelling   correct      
##    <chr>         <chr>        
##  1 Sanhedrim     Sanhedrin    
##  2 cyclinder     cylinder     
##  3 beastiality   bestiality   
##  4 consicousness consciousness
##  5 affilate      affiliate    
##  6 repubicans    republicans  
##  7 comitted      committed    
##  8 emmisions     emissions    
##  9 acquited      acquitted    
## 10 decompositing decomposing

再准备一个数据框:

代码语言:javascript
复制
library(qdapDictionaries)
words <- tbl_df(DICTIONARY)

head(words)
## # A tibble: 6 × 2
##   word  syllables
##   <chr>     <dbl>
## 1 hm            1
## 2 hmm           1
## 3 hmmm          1
## 4 hmph          1
## 5 mmhmm         2
## 6 mmhm          2

现在我们根据sub_misspellings中的misspelling列和words中的word列进行连接,正常情况下,由于misspelling列中都是拼错的单词,它是不可能连接起来的,但是stringdist_inner_join可以根据单词之间的距离进行连接,达到忽略拼写错误的目的:

代码语言:javascript
复制
joined <- sub_misspellings %>%
  stringdist_inner_join(words, by = c(misspelling = "word"), max_dist = 1)

joined
## # A tibble: 3 × 4
##   misspelling correct    word       syllables
##   <chr>       <chr>      <chr>          <dbl>
## 1 cyclinder   cylinder   cylinder           3
## 2 beastiality bestiality bestiality         5
## 3 affilate    affiliate  affiliate          4

其他功能

这个函数的功能都是和连接相关的,大家可以查看包的帮助文档进一步了解。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 医学和生信笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 忽略大小写的连接
  • 根据距离连接
  • 其他功能
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档