こんにちは,shun(@datasciencemore)です!
今回はキー結合をやっていきます.
キー結合ができると複数のデータフレームの処理が楽になりますよ♪
それでは,見ていきましょう.
0.キー結合ってなに??
キー結合は2つのデータフレームを,キーをもとに1つに結合することだよ.
キー結合のパターンは,全部で4種類あるよ.
キー結合のパターンは以下になります.
キー結合は,inner_join(インナージョイン),left_join(レフトジョイン),right_join(ライトジョイン),full_join(フルジョイン)の4種類があり,キーをもとに2つのデータフレームを結びつけるのです.
今回は,とある従業員の名簿と所属を表したデータフレームを結合することを考えてみましょう.
実務でもこのパターンは頻出です.
例として,以下の2つのデータフレームを定義します.
df_name : 名簿のデータフレーム
df_group : 所属のデータフレーム
1 2 3 4 5 6 |
# 名簿のデータフレーム定義 df_name = tibble( key = c(1, 1, 3, 2, 5), name = c("asuka", "yuuki", "siho", "rina", "manaka") ) |
1 2 3 4 5 6 7 8 9 |
> df_name # A tibble: 5 x 2 key name <dbl> <chr> 1 1 asuka 2 1 yuuki 3 3 siho 4 2 rina 5 5 manaka |
1 2 3 4 5 6 |
# 所属のデータフレーム定義 df_group = tibble( key = 1:4, group = c("nogi", "sakura", "hinata", "yosimoto") ) |
1 2 3 4 5 6 7 |
# A tibble: 4 x 2 key group <int> <chr> 1 1 nogi 2 2 sakura 3 3 hinata 4 4 yosimoto |
それでは,この2つのデータフレームで,4種類のキー結合についてみていきましょう.
2つのデータフレームのkey列がキーとします.
1.inner_join
inner_joinは,2つのデータフレームに共通するキーに対して,結合することをいいます.
この例の場合,
df_nameのキーが「1,2,3,5」,df_groupのキーが「1,2,3,4」なので,
共通するキーは,「1,2,3」になりますね.
このキーに対して2つのデータフレームを結合したものが出力になります.
これも言葉だとよくわからないですが,実例を見れば一発です!
図の左側を見ると,2つのデータフレームのキーごとに違う色の線が伸びていますね.
(キーが1 ⇒ ピンク,キーが2 ⇒ 緑,キーが3 ⇒ 青)
これらの伸びた線を見て,同じ色が交差する交点が,出力されるデータフレームの各行に対応します.
図の左側を見ると,ピンクが2点,緑が1点,青が1点,交差していますね.
これらの交点が,右側のデータフレームの各行に対応していることをきちんと確認してくださいね.
2つのデータフレームからキー毎に違う色の線を引いて,同じ色が交差する交点に対応する行が出力される. という考え方は,キーが一意でも重複していても使用できます.
汎用性がとても高い方法なので,ベン図だけではなく,こちらもしっかり理解してくださいね!
それでは,Rのコードを見てみましょう.
1 2 3 |
# df_nameとdf_groupをinner_join df_inner_join = inner_join(df_name, df_group) |
1 2 3 4 5 6 7 8 |
> df_inner_join # A tibble: 4 x 3 key name group <dbl> <chr> <chr> 1 1 asuka nogi 2 1 yuuki nogi 3 3 siho hinata 4 2 rina sakura |
うまく出力できましたね.
残りの3つのキー結合についても,基本は同じです.
2.left_join
left_joinは,左側のデータフレームのすべてのキーに対して,結合します.
ちなみにキー結合するときの左と右は,()内のデータフレームの位置を示しています. left_join(x, y)であったら,xが左側でyが右側にあるので,xを左側のデータフレーム,yを右側のデータフレームって呼んでいます.
今回の例の場合,
左側のデータフレームは,df_nameでキーが「1,2,3,5」,
右側のデータフレームは,df_groupでキーが「1,2,3,4」なので,
左側のデータフレームのキーは,「1,2,3,5」になりますね.
あれれー,右側のデータフレーム(df_group)にキー5がありませんね?
この場合はどのような処理になるんだろう?
おっ,いいところに気づいたね.
これだと,右側のデータフレームからキー5に対する線が引けないから,キー5に対する行は出力されないよね.
そこで,このような場合は,右側のデータフレームにNAの行を挿入して考えるんだ.
こうするとキー5に対して,左からも右からも線が引けるため,交点ができて,それに対応する行が出力できます.
Rのコードで確認してみましょう.
1 2 3 |
# df_nameとdf_groupをleft_join df_left_join = left_join(df_name, df_group) |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 key name group <dbl> <chr> <chr> 1 1 asuka nogi 2 1 yuuki nogi 3 3 siho hinata 4 2 rina sakura 5 5 manaka NA |
OKですね!
3.right_join
right_joinは,右側のデータフレームのすべてのキーに対して,結合します.
さっきやったleft_joinの反対だから,わかりやすいですね.
ただ,左と右が違うだけです.
今回の例の場合,
左側のデータフレームは,df_nameでキーが「1,2,3,5」,
右側のデータフレームは,df_groupでキーが「1,2,3,4」なので,
右側のデータフレームのキーは,「1,2,3,4」になりますね.
今回は,左側のデータフレームにキー4がないので,キー4に対してNAの行を作成してあげましょう.
Rでも確認してみます.
1 2 3 |
# df_nameとdf_groupをright_join df_right_join = right_join(df_name, df_group) |
1 2 3 4 5 6 7 8 9 |
> df_right_join # A tibble: 5 x 3 key name group <dbl> <chr> <chr> 1 1 asuka nogi 2 1 yuuki nogi 3 3 siho hinata 4 2 rina sakura 5 4 NA yosimoto |
きちんと出力されました!
4.full_join
最後はfull_joinです.
っといっても今までのことが理解できていればそんなに難しくありません.
fullは,2つのデータフレームのすべてのキーに対して,結合します.
今回の例の場合,
df_nameのキーが「1,2,3,5」,df_groupのキーが「1,2,3,4」なので,
full_joinに使用されるのキーは,「1,2,3,4,5」になりますね.
これも今までと同様に,キーがない場合については,NAの行を挿入してあげます.
df_nameにはキー4が,df_groupにはキー5がないから,それぞれについてNAの行を挿入して考えてくださいね.
Rのコードはこうなります.
1 2 |
df_full_join = full_join(df_name, df_group) |
1 2 3 4 5 6 7 8 9 10 |
> df_full_join # A tibble: 6 x 3 key name group <dbl> <chr> <chr> 1 1 asuka nogi 2 1 yuuki nogi 3 3 siho hinata 4 2 rina sakura 5 5 manaka NA 6 4 NA yosimoto |
バッチリですね!
今回の例では,2つのデータフレームのキーが両方ともkey列でした.
このように,join系の関数は,デフォルトだと同じ列名である列をキーとします.
もちろん,2つのデータフレームの列名が異なっていてもキーとすることができます.
そのような場合は,ただbyで名前付きベクトルを使用して,キーにしたい列名を指定してあげるだけです.
例えば,左側のデータフレームのキーがkey_1,右側のデータフレームのキーがkey_2だった場合は,
1 |
inner_join(df_name, df_group, by = c("key_1" = "key_2")) |
とすればOKです.
また,キーは当然,複数列あっても大丈夫です.
まとめ
いやー,今回は多かったですねー.
まとめると
- inner_join:2つのデータフレームに共通するキーに対して結合
- left_join :左側のデータフレームのすべてのキーに対して結合
- right_join :右側のデータフレームのすべてのキーに対して結合
- full_join :2つのデータフレームのすべてのキーに対して結合
イメージについては,ベン図だけでなく交点から出力を導出するやり方も覚えてくださいね.
次回は,データフレームの結合の第2弾,同じ形状のデータフレームの結合についてやります.
ただ,これは簡単ですのですぐに終わるでしょう笑
それじゃ,お疲れさまでした!!