自在に操る

【R】テーブルの結合 | 【図解】 join関数群を使ったテーブル結合法

2021年7月4日

概要

  • テーブル同士の結合はdplyrパッケージのjoin群が便利
  • 結合のさせ方によってそれぞれ関数が用意されている

イメージ

今回紹介するテーブルの結合は次のような操作を想定しています。

テーブルを結合する時は、共通する内容を持つ列が、両方のテーブルにある必要があります。この共通の列をもとに2つのテーブルを1つにくっつけます。

2つのテーブルに共通する内容を持つ列を使ってテーブルを結合する。

様々な結合方法

テーブルを結合する時は結合様式を考慮して結合する必要があります。結合様式に関しては以下のようなパターンがあります。

共通した列の内容が完全に一致していれば問題ないですが、完全一致しない場合はどちらのテーブルを優先するか考える必要があります

テーブルを結合するときはデータをどのように結合するかを考えて結合する必要がある。

dplyr::join関数系

様々な結合パターンに対応した関数がdplyrパッケージには存在します。ここではそれらについて紹介していきます。

全結合 | dplyr::full_join()

両方のテーブルのデータを採用して結合する時はfull_join関数が便利です。

今回はdplyrパッケージで用意されている band_instruments データと band_members データを full_join()関数で結合させる例を紹介します。

今回ここで実施したい操作は以下の図の通りです。name列を結合する際の共通データとして使用して結合させます。

上の図の操作を実施するためのコードは下の通りです。

library(dplyr)
full_join(x = band_instruments, y = band_members, by = "name")
#> # A tibble: 4 x 3
#>   name  plays  band   
#>   <chr> <chr>  <chr>  
#> 1 John  guitar Beatles
#> 2 Paul  bass   Beatles
#> 3 Keith guitar NA     
#> 4 Mick  NA     Stones 

full_join()をすることによって全てのname列のレコードが残される形で結合しており、データが不足している所はNAで置き換えられているのが確認できます。

両方のテーブルのデータを残して結合する場合は full_join()関数を使う。

共通部分結合 | dplyr::inner_join

両方のテーブルで共通している部分だけ抽出して結合するのが inner_join()関数です。

ここでは下の図のように、band_instruments データと band_members データを inner_join()関数で結合させてみます。

上の図の操作を実施するためのコードは以下の通りです。

library(dplyr)
inner_join(x = band_instruments, y = band_members, by = "name")
#> # A tibble: 2 x 3
#>   name  plays  band   
#>   <chr> <chr>  <chr>  
#> 1 John  guitar Beatles
#> 2 Paul  bass   Beatles

結果を見て分かるように今回の処理では両方のデータテーブルに共通しているレコードのみ残されています

2つのテーブルで共通するレコードだけを残して結合するときは inner_join()関数を使う。

Xのみ全データを残し結合 | dplyr::left_join()

第1引数もしくは x で指定したテーブルの内容を残して結合する場合はleft_join関数が便利です。

ここでは下の図のようにleft_join()関数で結合させてみます。

上の図の処理を実行するコードは下の通りです。

library(dplyr)
left_join(x = band_instruments, y = band_members, by = "name")
#> # A tibble: 3 x 3
#>   name  plays  band   
#>   <chr> <chr>  <chr>  
#> 1 John  guitar Beatles
#> 2 Paul  bass   Beatles
#> 3 Keith guitar NA     

今回の処理ではX側に含まれるレコードのみすべて残されています

X側に含まれるレコードを全て残して結合する時は left_join()関数を使う。

Yのみ全データを残し結合 | dplyr::right_join()

第2引数もしくは y で指定したテーブルの内容を残して結合する場合はright_join関数が便利です。

ここでは下の図のようにright_join()関数で結合させる場合を考えてみます。

上の図の処理を実行するコードは下の通りです。

library(dplyr)
right_join(x = band_instruments, y = band_members, by = "name")
#> # A tibble: 3 x 3
#>   name  plays  band   
#>   <chr> <chr>  <chr>  
#> 1 John  guitar Beatles
#> 2 Paul  bass   Beatles
#> 3 Mick  NA     Stones

結果を見て分かるようにY側に含まれるレコードのみすべて残されています

Y側に含まれるレコードを全て残して結合する時は left_join()関数を使う。

-自在に操る