如何在 r 中执行模糊匹配(附示例)
通常,您可能希望根据不完全匹配的字符串在 R 中连接两组数据。这有时称为模糊匹配。
在 R 中执行模糊匹配的最简单方法是使用fuzzyjoin包中的stringdist_join()函数。
下面的例子展示了如何在实际中使用这个功能。
示例:R 中的模糊匹配
假设我们在 R 中有以下两个数据框,其中包含有关各个篮球队的信息:
#create data frames df1 <- data. frame (team=c('Mavericks', 'Nets', 'Warriors', 'Heat', 'Lakers'), points=c(99, 90, 104, 117, 100)) df2 <- data. frame (team=c('Mavricks', 'Warrors', 'Heat', 'Netts', 'Kings', 'Lakes'), assists=c(22, 29, 17, 40, 32, 30)) #view data frames print (df1) team points 1 Mavericks 99 2 Nets 90 3 Warriors 104 4 Heat 117 5 Lakers 100 print (df2) team assists 1 Mavricks 22 2 Warriors 29 3 Heat 17 4 Netts 40 5 Kings 32 6 Lakes 30
现在,假设我们想要进行左连接,保留第一个数据帧中的所有行,并根据第二个数据帧中最匹配的团队名称简单地合并它们。
我们可以使用下面的代码来做到这一点:
library (fuzzyjoin)
library (dplyr)
#perform fuzzy matching left join
stringdist_join(df1, df2,
by=' team ', #match based on team
mode=' left ', #use left join
method = " jw ", #use jw distance metric
max_dist=99,
distance_col=' dist ') %>%
group_by(team.x) %>%
slice_min(order_by=dist, n= 1 )
# A tibble: 5 x 5
# Groups: team.x [5]
team.x points team.y assists dist
1 Heat 117 Heat 17 0
2 Lakers 100 Lakes 30 0.0556
3 Mavericks 99 Mavricks 22 0.0370
4 Nets 90 Nets 40 0.0667
5 Warriors 104 Warriors 29 0.0417
结果是一个数据帧,其中包含第一个数据帧中的原始五个团队名称中的每一个以及与第二个数据帧最匹配的团队。
注意#1 :我们选择使用jw距离度量进行匹配。这是Jaro-Winkler distance的缩写,它是衡量两个字符串之间差异的度量。
注意#2:我们使用 dplyr 包中的slice_min()函数仅显示第二个数据帧中与第一个数据帧中的团队名称最匹配的团队名称。
其他资源
以下教程解释了如何在 R 中执行其他常见任务: