r - 模糊地址匹配 R
问题描述
是的,以前有人问过,但我找不到一个线程可以为这个问题提供一个简单、干净的答案。
我在下面有示例数据 - 我有两列,col1 是当前地址,col2 是我被告知比当前地址“更好”的地址。我需要看看第二列比第一列“好”多少。大多数情况下,第二个更好,因为它包含第一个缺少的辅助信息,例如公寓号码。
test <- as.data.frame(matrix(c(
"742 Evergreen Terrace" , "742 Evergreen Terrace Apt 3" ,
"31 Spooner Street #42" , "31 Spooner Street",
"129 W 81st Street" , "129 W 81st Street Apt 5A" ,
"245 E 73rd Street", "245 E 73rd Street Apt 6") , ncol=2, byrow=TRUE,
dimnames=list(NULL, c("old_addr" , "new_addr"))) ,stringsAsFactors=FALSE)
我在这里找到了一个接近我想要的答案: Fuzzy match row in one column with the same row in next column
我需要创建第三列,它是一个简单的 1/0 变量,如果是近似匹配,则 == 1,如果不是,则为 0。我需要能够为近似匹配指定阈值。
对于我的第一个示例 - 742 Evergreen Terrace vs 742 Evergreen Terrace Apt 3,长度相差六。我需要能够指定六、八或其他的长度差。
我查看了 agrep,但我需要比较同一行中的两列数据,但它不允许这样做。我也尝试过 lapply,但它的结果让我认为它正在循环遍历整个列中的所有数据,我需要逐行比较。还有我不明白的最大距离,下面的 ifelse 和最大值为 1(如果我正确理解为 1 == 可以有一个编辑或更改单位),它应该会抛出错误,但它只会在一个案子。
agrep(test$old_addr, test$new_addr, max.distance = 0.1, ignore.case = TRUE)
test$fuzz_match <- lapply(test$old_addr , agrep , x =
test$new_addr , max.distance = 1 , ignore.case = TRUE)
任何帮助表示赞赏,谢谢!
解决方案
您可以计算每对之间的Levenshtein 距离。那么你需要决定的是距离必须有多大才能使两者不是同一个地址。
test$lev_dist <- mapply(adist, test$old_addr, test$new_addr)
test$same_addr <- test$lev_dist < 5
test
# old_addr new_addr lev_dist same_addr
# 1 742 Evergreen Terrace 742 Evergreen Terrace Apt 3 6 FALSE
# 2 31 Spooner Street #42 31 Spooner Street 4 TRUE
# 3 129 W 81st Street 129 W 81st Street Apt 5A 7 FALSE
# 4 245 E 73rd Street 245 E 73rd Street Apt 6 6 FALSE
您可以以类似的方式agrep()
一起使用。mapply()
test$agrep_match <- mapply(agrep, test$old_addr, test$new_addr)
test$agrep_match <- lengths(test$agrep_match) == 1
test
# old_addr new_addr agrep_match
# 1 742 Evergreen Terrace 742 Evergreen Terrace Apt 3 TRUE
# 2 31 Spooner Street #42 31 Spooner Street FALSE
# 3 129 W 81st Street 129 W 81st Street Apt 5A TRUE
# 4 245 E 73rd Street 245 E 73rd Street Apt 6 TRUE
agrep()
也是基于 Levenshtein 距离,但有很多不同的选项来调整阈值,我相信你已经找到了。
除了 Levenshtein 之外,还有其他不同的措施可能更适合此应用程序。包stringdist
有许多其他可用的字符串距离指标。
推荐阅读
- node.js - 如何在 Windows 中将 npm start 添加为服务
- json - 打字稿中的 JSON 转换
- php - 显示特定尺寸的图像
- c# - 在服务器上运行时获取 AD 组列表失败
- c# - 实例化一个对象但不存储对它的引用
- javascript - 开玩笑测试 onClick() 得到错误“预期的模拟函数已被调用,但没有被调用。”
- java - Swing 应用程序 Exported Jar 扩大维度
- java - 匹配单词的正则表达式以特殊字符的组合开头和结尾
- android - 无法解决:com.android.support:support-v4:28.0.0-rc01
- javascript - 节点从 DOM 生成图像