3 回答
TA贡献1828条经验 获得超13个赞
这是使用该fuzzyjoin包装的解决方案。它使用类似dplyr语法,并stringdist作为模糊匹配的可能类型之一。
如C8H10N4O2 所建议,stringdistmethod =“ jw”为您的示例创建最佳匹配。
作为建议由dgrtwo,fuzzyjoin的开发商,我用了一个大max_dist,然后使用dplyr::group_by和dplyr::top_n只得到最小距离的最佳匹配。
a <- data.frame(name = c('Ace Co', 'Bayes', 'asd', 'Bcy', 'Baes', 'Bays'),
price = c(10, 13, 2, 1, 15, 1))
b <- data.frame(name = c('Ace Co.', 'Bayes Inc.', 'asdf'),
qty = c(9, 99, 10))
library(fuzzyjoin); library(dplyr);
stringdist_join(a, b,
by = "name",
mode = "left",
ignore_case = FALSE,
method = "jw",
max_dist = 99,
distance_col = "dist") %>%
group_by(name.x) %>%
top_n(1, -dist)
#> # A tibble: 6 x 5
#> # Groups: name.x [6]
#> name.x price name.y qty dist
#> <fctr> <dbl> <fctr> <dbl> <dbl>
#> 1 Ace Co 10 Ace Co. 9 0.04761905
#> 2 Bayes 13 Bayes Inc. 99 0.16666667
#> 3 asd 2 asdf 10 0.08333333
#> 4 Bcy 1 Bayes Inc. 99 0.37777778
#> 5 Baes 15 Bayes Inc. 99 0.20000000
#> 6 Bays 1 Bayes Inc. 99 0.20000000
- 3 回答
- 0 关注
- 1012 浏览
添加回答
举报