我有两个包含地址的表(街道、城市、邮政编码和两个包含这些值的字段),我想对邮政编码进行模糊匹配,但仅适用于具有完全相同 StrCity 值的情况。我首先从字典中仅选择与 StrCity 匹配的地址,然后进行模糊匹配,但有两个问题:
1) 如果通过 Zipcode 匹配,则不考虑街道和城市 2) 如果通过 Address 匹配(包含所有 Zipcode、Street 和 City),它也返回可能的值,在同一邮政编码上还有另一条街道就距离而言,这是足够近的。
可能我需要同时进行两个不同的匹配(一个是模糊的,一个是精确的),但我不确定如何实现它,同时又不会影响我的计算机性能。
以下是 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 位数字的差异,那么它可能会错误地建议替换街道,而应更改邮政编码。
注意:我正在使用packagespurrr
和.dplyr
fuzzyjoin