【发布时间】:2017-08-02 15:09:48
【问题描述】:
我有两个大型数据集,一个大约一百万条记录,另一个大约 70K。这些数据集有地址。如果较小数据集中的任何地址存在于较大数据集中,我想匹配。正如您想象的那样,地址可以以不同的方式和不同的情况/拼写等方式编写。除此之外,如果只写到建筑物级别,则可以复制此地址。所以不同的公寓有相同的地址。我做了一些研究,并找出了可以使用的包 stringdist。
我做了一些工作,并设法根据距离获得最接近的匹配。但是我无法返回地址匹配的相应列。
下面是一个示例虚拟数据以及我为解释这种情况而创建的代码
library(stringdist)
Address1 <- c("786, GALI NO 5, XYZ","rambo, 45, strret 4, atlast, pqr","23/4, 23RD FLOOR, STREET 2, ABC-E, PQR","45-B, GALI NO5, XYZ","HECTIC, 99 STREET, PQR","786, GALI NO 5, XYZ","rambo, 45, strret 4, atlast, pqr")
Year1 <- c(2001:2007)
Address2 <- c("abc, pqr, xyz","786, GALI NO 4 XYZ","45B, GALI NO 5, XYZ","del, 546, strret2, towards east, pqr","23/4, STREET 2, PQR","abc, pqr, xyz","786, GALI NO 4 XYZ","45B, GALI NO 5, XYZ","del, 546, strret2, towards east, pqr","23/4, STREET 2, PQR")
Year2 <- c(2001:2010)
df1 <- data.table(Address1,Year1)
df2 <- data.table(Address2,Year2)
df2[,unique_id := sprintf("%06d", 1:nrow(df2))]
fn_match = function(str, strVec, n){
strVec[amatch(str, strVec, method = "dl", maxDist=n,useBytes = T)]
}
df1[!is.na(Address1)
, address_match :=
fn_match(Address1, df2$Address2,3)
]
这将返回基于距离 3 的封闭字符串匹配,但是我希望在 df1 中也有来自 df2 的“Year”和“unique_id”列。这将帮助我知道字符串与 df2 中的哪一行数据匹配。所以最后我想知道 df1 中的每一行 根据指定的距离与 df2 最接近的匹配是什么,并且对于匹配的行具有特定的 “年份”和来自df2的“unique_id”。
我想这与合并(左连接)有关,但我不确定如何合并以保留重复项并确保我具有与 df1(小型数据集)中相同的行数。
任何一种解决方案都会有所帮助!
【问题讨论】:
-
现在不在我的电脑上,但请参阅
?which.min以包装您上一个问题中的stringdist()。还要考虑你想如何处理关系。 -
@C8H10N4O2,谢谢您的建议。是的,which.min 有助于了解最小值,但在这种情况下,我希望匹配字符串中的对应列很少。由于大型数据集中有重复的地址,我希望拥有 unique_id 能够区分匹配的行,然后我可以根据 unique_id 从大型数据集中合并其他需要的列。
-
@C8H10N4O2,我真的希望您能就此提出一些解决方案。即使我们能够从大型数据集中返回匹配字符串的行号,它也应该可以帮助我根据行号合并所需的列。
标签: r merge data.table string-matching stringdist