我有兩個大型數據集,一個大約50萬條記錄,另一個大約70K。這些數據集具有地址。如果較小數據集中的任何地址存在於較大數據集中,我想匹配。正如你所想象的,地址可以用不同的方式和不同的案例/拼寫等書寫。除了這個地址可以複製,如果只寫到建築物的水平。所以不同的單位有相同的地址。我做了一些研究並找出了可以使用的packagedist。R模糊字符串匹配返回基於匹配字符串的特定列
我做了一些工作,並設法根據距離獲得最接近的匹配。但是,我無法返回地址匹配的相應列。
下面是一個代碼一起樣本僞數據,我已經創建說明情況
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開始的「年」和「unique_id」。這將幫助我知道字符串與df2匹配的是哪一行數據。所以最後我想知道每一行DF1什麼是從DF2基於從DF2匹配行規定,並有具體的「年」和「UNIQUE_ID」的距離衣櫃比賽。
我想有一些與合併(左連接)有關,但我不知道如何合併保留重複項並確保我具有與df1(小數據集)相同的行數。
任何一種解決方案都會有所幫助!
不是在我的電腦上的權利,但看到'which.min'包'stringdist( )'從你以前的問題。考慮你想如何處理關係。 – C8H10N4O2
@ C8H10N4O2,謝謝您的建議。是的,which.min有助於瞭解最小值,但在這種情況下,我希望從匹配的字符串中找到幾個相應的列。由於大數據集中存在重複地址,因此我希望unique_id能夠區分匹配的行,然後我可以從大數據集中合併其他所需的列unique_id。 – user1412
@ C8H10N4O2,我真的希望你能提出一些解決方案。即使我們能夠從大數據集中返回匹配字符串的行號,它也應該幫助我然後根據行號合併所需的列。 – user1412