R语言模糊匹配连接fuzzyjoin

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_

安装

install.packages("fuzzyjoin")
#或者
devtools::install_github("dgrtwo/fuzzyjoin")

忽略大小写的连接

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

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)

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

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得不到任何结果:

inner_join(df1,df2,by="a")
## [1] a b d
## <0 rows> (or 0-length row.names)

但是regex_inner_join就可以实现连接:

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

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

根据距离连接

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

准备一个数据框:

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

再准备一个数据框:

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可以根据单词之间的距离进行连接,达到忽略拼写错误的目的:

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

其他功能

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值