概要
- テーブル同士の結合は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()関数を使う。