こんにちは,shun(@datasciencemore)です!
前回までは{dplyr}編でした.
{dplyr}だけでもかなりの前処理力がついたと思いますが,tidyverseの力はまだまだこんなもんじゃありません.
今回から新しいパッケージ{tidyr}についてやっていきましょう.
{tidyr}はデータフレームをtidyにするのに特化したパッケージです.
tidyの意味は後述しますね!
今回は{tidyr}でもっともよく使用する縦横変換についてやっていきます!
縦横変換とは何なのでしょうか?
じっくり見ていきましょう.
0.縦横変換ってなに??


データフレームの内容を変えないで,形を変えることだよ.
縦型(long型)にする場合と横型(wide型)にする場合があるから,合わせて縦横変換って呼んでるよ.
はい,例のごとく言葉だけだとよくわかりませんね..
さっそくイメージ図を見てみましょう.
この例では,お店(A,B,C)のみかんとりんごの1つ当たりの値段を表に示しています.
左の表と右の表で,内容に違いはありませんが,形が違います.
私たち人間にとってわかりやすいのは,左の表ではないでしょうか?
このような表をExcelなどでよく目にする機会があると思います.
しかし,実はコンピュータは右の表が理解しやすいのです.
なぜかというと右の表は,変数が一列にまとめられているからです.
この右の表のような状態のことをtidyというのです.
図を見比べると一目瞭然ですね.
ですから,コンピュータに処理を頼むときは,左から右に変換することがよくあります.
これを縦変換と呼び,pivot_longerを使用することで実現できます.
また,逆に人間にとってわかりやすい表を得るために右から左へ変換することもよくあります.
これを横変換と呼び,pivot_widerを使用することで実現できるのです.
ちなみに縦変換,横変換はこのサイトだけの造語ですが,意外と一般的に通じると思いますよ笑
それでは,これから具体例を挙げて説明しますね.
データはさっきのデータを英語にしたものを使用します.
さっきはわかりやすさのため,日本語の表を使用しましたが,コーディングするときは日本語はなるべく避けましょう
予期しないことが多々起きるので...
日本人は人生ハードモードですね...
1 2 3 4 5 6 |
# wide型のデータフレームを定義 df_wide = tibble( store = c("A", "B", "C"), orange = c(100, 70, 120), apple = c(150, 90, 80) ) |
1 2 3 4 5 6 7 |
> df_wide # A tibble: 3 x 3 store orange apple <chr> <dbl> <dbl> 1 A 100 150 2 B 70 90 3 C 120 80 |
さきほどのイメージを更新します.
このイメージをもとに具体的な使い方を見ていきましょう.
1.縦変換 pivot_longer
コードはこんな感じです.
1 2 3 4 5 6 7 8 |
# wide型をlong型に変換 df_long = df_wide %>% pivot_longer( cols = c(orange, apple), names_to = "fruit", values_to = "price" ) |
1 2 3 4 5 6 7 8 9 10 |
> df_long # A tibble: 6 x 3 store fruit price <chr> <chr> <dbl> 1 A orange 100 2 A apple 150 3 B orange 70 4 B apple 90 5 C orange 120 6 C apple 80 |
ちゃんと縦変換できていますね!
2.横変換 pivot_wider
今度は,先ほどのデータフレームを横変換してみましょう.
1 2 3 4 5 6 |
# long型をwide型に変換 df_long %>% pivot_wider( names_from = fruit, values_from = price ) |
1 2 3 4 5 6 |
# A tibble: 3 x 3 store orange apple <chr> <dbl> <dbl> 1 A 100 150 2 B 70 90 3 C 120 80 |
はい,きちんとdf_wideに戻っていることが確認できました.
まとめ
今回は,縦横変換として,pivot_longerとpivot_widerを勉強しました.
これらを使用してデータフレームを縦変換したり,横変換したりできます.
これらを屈指して自由自在にデータフレームを変形できるようになってくださいね!
ちなみに今回ご紹介した例は,いちばん簡単な例になります笑
実務ではもっと複雑なデータフレームに対し,様々な縦横変換をすることが結構あります.
そのための便利オプションもpivot_longerとpivot_widerは色々持っているので,それはまた別記事で紹介しますね.
それじゃ,お疲れ様でした!!