fuzzyjoin
包是dplyr
连接操作的变体,它可以支持模糊(匹配)连接,比如忽略单词之间的大小写,根据正则表达式进行连接,忽略单词的拼写错误等。
该包中的函数命名也很简单易懂,对于六个dplyr
中join
操作的每个变体,只要在前面加上统一的前缀即可,比如,根据正则表达式进行连接:
除此之外,还有以下前缀:
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
这个函数的功能都是和连接相关的,大家可以查看包的帮助文档进一步了解。