R でファジーマッチングを実行する方法 (例あり)


多くの場合、不完全に一致する文字列に基づいて R の 2 つのデータ セットを結合したい場合があります。これは、ファジーマッチングと呼ばれることもあります。

R でファジー マッチングを実行する最も簡単な方法は、 fuzzyjoinパッケージのstringdist_join()関数を使用することです。

次の例は、この関数を実際に使用する方法を示しています。

例: R でのファジーマッチング

R に、さまざまなバスケットボール チームに関する情報を含む次の 2 つのデータ フレームがあるとします。

 #create data frames
df1 <- data. frame (team=c('Mavericks', 'Nets', 'Warriors', 'Heat', 'Lakers'),
                  points=c(99, 90, 104, 117, 100))
df2 <- data. frame (team=c('Mavricks', 'Warrors', 'Heat', 'Netts', 'Kings', 'Lakes'),
                  assists=c(22, 29, 17, 40, 32, 30))

#view data frames
print (df1)

       team points
1 Mavericks 99
2 Nets 90
3 Warriors 104
4 Heat 117
5 Lakers 100

print (df2)

      team assists
1 Mavricks 22
2 Warriors 29
3 Heat 17
4 Netts 40
5 Kings 32
6 Lakes 30

ここで、最初のデータ フレームのすべての行を保持し、2 番目のデータ フレームで最も一致するチーム名に基づいてそれらを単純にマージする結合を実行するとします。

これを行うには、次のコードを使用できます。

 library (fuzzyjoin)
library (dplyr)

#perform fuzzy matching left join
stringdist_join(df1, df2, 
                by=' team ', #match based on team
                mode=' left ', #use left join
                method = " jw ", #use jw distance metric
                max_dist=99, 
                distance_col=' dist ') %>%
  group_by(team.x) %>%
  slice_min(order_by=dist, n= 1 )

# A tibble: 5 x 5
# Groups: team.x [5]
  team.x points team.y assists dist
                 
1 Heat 117 Heat 17 0     
2 Lakers 100 Lakes 30 0.0556
3 Mavericks 99 Mavricks 22 0.0370
4 Nets 90 Nets 40 0.0667
5 Warriors 104 Warriors 29 0.0417

結果は、最初のデータ フレームの元の 5 つのチーム名それぞれと、2 番目のデータ フレームに最もよく一致するチームを含むデータ フレームになります。

注 #1 : マッチングにはjw距離メトリックを使用することを選択します。これは、2 つの文字列間の差を測定する指標であるJaro-Winkler distanceの略です。

注 #2: dplyr パッケージのスライス_min()関数を使用して、最初のデータ フレームのチーム名に最もよく一致する 2 番目のデータ フレームのチーム名のみを表示しました。

追加リソース

次のチュートリアルでは、R で他の一般的なタスクを実行する方法について説明します。

Rで複数のデータフレームをマージする方法
R の複数の列に基づいてデータ フレームをマージする方法

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です