我有两个包含地址的表(街道,城市,邮政编码和两个包含这些连接值的字段),我想对Zipcode进行模糊匹配,但仅适用于具有完全相同StrCity值的情况.我开始首先只选择与字典中的StrCity匹配然后进行模糊匹配的地址,但有两个问题:
1)如果与Zipcode匹配,它不考虑街道和城市2)如果匹配地址(包含所有的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
Run Code Online (Sandbox Code Playgroud)
字典样本:
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
Run Code Online (Sandbox Code Playgroud)
这是我目前的代码:
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, …Run Code Online (Sandbox Code Playgroud) 我想使用 adist 计算每行中两列值之间的编辑距离。
我或多或少是这样使用它的:
A <- c("mad","car")
B <- c("mug","cat")
my_df <- data.frame(A,B)
my_df$dist <- adist(my_df$A, my_df$B, ignore.case = TRUE)
my_df <- my_df[order(dist),]
Run Code Online (Sandbox Code Playgroud)
最后两行与我的情况相同,但实际数据框看起来有点不同 - 我的原始数据框的列是字符类型,而不是因子。此外, dist 列似乎作为 2 列矩阵返回,我不知道为什么会发生这种情况。
更新:我读了一点,发现我需要将它应用于行,所以我的新代码如下:
apply(my_df, 1, function(d) adist(d[1], d[2]))
Run Code Online (Sandbox Code Playgroud)
它工作正常,但对于我通过列号调用它的原始数据集是不切实际的,我如何在这个函数中引用列名?