【发布时间】:2018-06-09 02:03:33
【问题描述】:
我有两个包含地址的表(街道、城市、邮政编码和两个包含这些值的字段),我想对 Zipcode 进行模糊匹配,但仅适用于具有完全相同 StrCity 值的情况。我首先从字典中仅选择与 StrCity 匹配的地址,然后进行模糊匹配,但有两个问题:
1) 如果通过 Zipcode 匹配,则不考虑街道和城市 2) 如果与 Address 匹配(包含所有 Zipcode、Street 和 City),它还返回可能的值,其中在相同的 zipcode 上还有另一条就距离而言足够近的街道。
可能我需要同时进行两个不同的匹配(一个是模糊匹配,一个是精确匹配),但我不确定如何实现它,同时又不会影响我的计算机性能。
这是 TableAd 的数据示例:
StrCity ID Zipcode Street City Address
BiałowiejskaWarszawa 5148676 01-459 Białowiejska Warszawa 01-459BiałowiejskaWarszawa
BukowińskaWarszawa 6423687 02-730 Bukowińska Warszawa 02-730BukowińskaWarszawa
KanałowaWarszawa 6425093 03-536 Kanałowa Warszawa 03-536KanałowaWarszawa
还有字典样本:
Zipcode Street City Address StrCity
02-882 Agaty Warszawa 02-882AgatyWarszawa AgatyWarszawa
03-663 Kanałowa Warszawa 03-663KanałowaWarszawa KanałowaWarszawa
03-536 Kołowa Warszawa 03-536KołowaWarszawa KołowaWarszawa
这是我当前的代码:
TableMatch <- merge(TableAd, TableDict, by="StrCity")
TableMatch <- TableMatch[, -grep("y", colnames(TableMatch))]
names(TableMatch)[names(TableMatch)=="Zipcode.x"] <- "Zipcode"
names(TableMatch)[names(TableMatch)=="Address.x"] <- "Address"
ResultTable <- TableMatch %>%
stringdist_left_join(TableDict, by="Address", distance_col="dist", method="lv", max_dist=5, ignore_case = TRUE) %>%
select(ID, Zipcode.x, Address.x, Address.y, dist) %>%
group_by(Address.x) %>%
# select best fit record
top_n(-1, dist)
我在上面提供的示例中特别发现的问题 - 脚本验证 strCity KanałowaWarszawa 是否存在于字典中,但在更改邮政编码时,组合地址字符串的 Levenshtein 距离与将街道更改为 Kołowa 时相同,后者具有与检查的邮政编码相同。 在这里它会返回两个更改,但如果邮政编码只有 2 位或 1 位数字的差异,那么它可能会错误地建议更换街道,而应更改邮政编码。
注意:我正在使用包purrr、dplyr 和fuzzyjoin。
【问题讨论】:
-
嗨,我遇到了一个非常相似的问题 - 任何解决方案有效?
-
@MCS 您可能对我在下面开发的答案感兴趣,如果我提出的解决方案不够有效,它可能对您自己的问题有用。
标签: r dplyr matching purrr fuzzyjoin