こんにちは,shun(@datasciencemore)です!!
ついにここまでやってきました!
今回はついにtidyverseのコアパッケージの最後のパッケージ{purrr}についてやっていきますよ!
{purrr}は繰り返し処理をするパッケージになります.
繰り返し処理とはどのような処理なのか,見ていきましょう.
0.{purrr}ってなに??


繰り返し処理は,行ごとに同じ処理を繰り返す処理のことだよ!
主に,以下のようなイメージです.
あれれ??
なんかこの図,前にも見た気がします.
気のせいかな??


いやいや,気のせいじゃないよ笑
実は,rowwiseの紹介のときもこの図と全く同じ図で説明したんだ.
行ごとの処理で使用する関数は,{dplyr}ではrowwise,{purrr}ではmapかpmapという関数が主に使用されます.
実は{dplyr}のrowwiseと{purrr}のmap,pmapはできることがほとんど一緒です.
行ごとの処理に関していえば,違いはコードの書き方だけ.出力は全く一緒です.
なんで同じような処理があるか歴史的な背景は省略しますが,(ぼくもそこまで詳しくないので...)
行ごとの処理はrowwiseで書くことをお勧めします.
その理由は,
rowwiseのほうが可読性が高い!!
からです.
同じ処理の内容のコードを{dplyr}のrowwiseと{purrr}のmapで書くので,どちらがいいか確認してみてください.


そうだね,ぼくもそう思う.
けど,人によると思うから好きなほうでいいと思うよ.
僕が思うそれぞれの良くないところは,
rowwise:いちいちlist化するのがめんどい
map:どの列を使用しているかわかりづらい
(.xという箇所はデータフレームの列を表しているのだが,少し前を見ないと.xがどの列を示しているのかわからない.)
ですね.
それぞれよくないところがありますが,個人的にはrowwiseが可読性が高いと思うためお勧めです.
ということで,大事なことはrowwiseでほとんどやったので,今回はサクッとしかやりません笑
以下3つの関数について,簡単に説明して終わりにしたいと思います.
- map
- pmap
- pwalk
実は{purrr}は,行処理以外にも少しマニアックなことができます.
しかし,実務でほとんど使わないことと,この講座はあくまで基礎講座ということを考慮し,その使い方は割愛いたします.
マニアックな使い方については,機会があれば記事にしますね!
まずは超重要な行処理についてマスターしてください!
1.map
mapは,処理の引数が1つの場合に使用します.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# cutでネストして,散布図を作成 引数:cut diamonds %>% group_nest(cut) %>% mutate( fig = data %>% map( ~ .x %>% ggplot(aes(x = carat, y = price)) + geom_point(color = "orange") ) ) |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 cut data fig <ord> <list<tbl_df[,9]>> <list> 1 Fair [1,610 × 9] <gg> 2 Good [4,906 × 9] <gg> 3 Very Good [12,082 × 9] <gg> 4 Premium [13,791 × 9] <gg> 5 Ideal [21,551 × 9] <gg> |
色の対応をよく確認してくださいね.
2.pmap
pmapは,処理の引数が2つ以上の場合に使用します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# cutでネストして,散布図を作成 引数:cutとdata diamonds %>% group_nest(cut) %>% mutate( fig = list(cut, data) %>% pmap( ~ ..2 %>% ggplot(aes(x = carat, y = price)) + geom_point(color = "orange") + labs(title = ..1) + theme( axis.text = element_text(size = 15), axis.title = element_text(size = 15), plot.title = element_text(hjust = 0.5) ) ) ) |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 cut data fig <ord> <list<tbl_df[,9]>> <list> 1 Fair [1,610 × 9] <gg> 2 Good [4,906 × 9] <gg> 3 Very Good [12,082 × 9] <gg> 4 Premium [13,791 × 9] <gg> 5 Ideal [21,551 × 9] <gg> |
こちらも色の対応に注意して,確認してください.
3.pwalk
データフレームに格納した図や情報をフォルダに保存したいときってありますよね.
そんなときはpwalkの出番です.
1 2 3 4 5 6 7 8 |
# cutでネストして系列ごとのデータフレームをCSVにして保存 引数:cutとdata diamonds %>% group_nest(cut) %>% pwalk( ~ ..2 %>% write_csv(str_c(..1, "_data.csv")) ) |
こちらも色の対応を...略
上のコードを実行するとワーキングディレクトリに5つのcsvファイルが出力されます.
確認してみてくださいね!
pwalkは,引数が複数のときに使います.
引数が単数のときはwalkを使用するのですが,実務で使ったことは1回もないので省略します笑
もし引数が単数でもpwalkで代用できるのでご安心ください.
まとめ
今回は繰り返し処理のパッケージ{purrr}についてやってきました.
{purrr}は主に行処理で使用し,mapとpmapを使えば行処理ができます.
そして,{dplyr}のrowwiseと{purrr}のmap,pmapはほぼ同じと考えていいです.
行処理については,各自で書きやすいほうを選びましょう.
行処理,めっちゃ重要ですよ!!
さぁようやくtidyverseの8個のコアパッケージの説明が終了しました.
長かったですね,本当にお疲れさまでした.
これでみなさん,もう前処理マスターです!!
といいたいところですが,前処理マスターへの道のりはもうちょいあります...
残りはNA処理と時間処理です.
ほんとにあとちょっとなので,もうちょっと付き合っていいただければ幸いでございます.
それじゃ,お疲れさまでした!!