2つの大きなデータセットがあります.1つは50万回、もう1回は70,000回です。これらのデータセットにはアドレスがあります。小さいデータセット内のアドレスのいずれかが大きいものに存在する場合、私は一致させたい。あなたが想像しているように、住所は異なった方法で書かれていても、異なった場合やスペルで書かれていても構いません。したがって、異なるフラットは同じ住所を持ちます。私はいくつかの調査を行い、使用可能なパッケージstringdistを見つけました。一致する文字列に基づいて特定の列を返すためのRファジー文字列一致
私はいくつかの仕事をして、距離に基づいて最も近い一致を得ることができました。しかし、私はアドレスが一致する対応する列を返すことができません。以下は
私はこれはしかし、私はまた、 "の列を持っていると思った、私の3の距離に基づいて、閉じたストリングの照合を返す状況
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)
]
を説明するために作成したコードと一緒にサンプルダミーデータであり、 df1のdf2から "Year"と "unique_id"を返します。これは、文字列がdf2から照合されたデータの行を知るのに役立ちます。だから、最終的に私がDF2から特定の「年」と「UNIQUE_ID」一致する行に指定したとしていた距離に基づいてDF2からクローゼットの試合が何であったかDF1に行ごとに知りたいです。
私はマージ(左結合)と関係があると思いますが、重複を維持してどのようにマージして、df1(小さなデータセット)と同じ数の行を持つことができるかわかりません。
どのような種類の解決策が役に立ちますか?あなたがそこに道の90%
ないが、ご覧 'which.min'(' stringdistをラップするには? ) 'を入力してください。また、ネクタイをどう扱うかを考えてみてください。 – C8H10N4O2
@ C8H10N4O2、ありがとうございます。はい、which.minは最小値を知るのに役立ちますが、この場合、一致する文字列から対応する列がほとんどないようにしたいのです。大きなデータセットに重複アドレスがあるので、一致する行を区別できるようにunique_idを設定し、大きなデータセットに基づいて他の必要な列をunique_idにマージすることができます。 – user1412
@ C8H10N4O2、私は本当にあなたがこれについていくつかの解決策を提案することができると期待しています。大きなデータセットから一致する文字列の行番号を返すことができたとしても、行番号に基づいて必要な列をマージするのに役立ちます。 – user1412