ちょっと、というかかなり出遅れた感がありますが、今更ながらdplyrの仕様を再び追いかけはじめました。今年に入ってdplyrがバージョンアップされたらしく、新しい関数が追加されたということでコマンドを叩いてみました。
所感としてgroup_by関数が知っていたのと大分違う感じになったなー、と。
触ってみたついでに新しく追加された関数を紹介していきたいと思います。
###group_nest関数
group_nest関数はグルーピングして入れ子にしたデータフレームの列を追加する関数です。
今回、dplyrが提供しているstarwarsのデータフレームをサンプルとして使用しています。
install.packages("pipeR")
install.packages("dplyr")
library("pipeR")
library("dplyr")
#入れ子にしたデータフレームの列を追加する
x<- starwars %>>%
group_by(name) %>>%
group_nest() %>>%
print()
実行結果は以下のようになります。
name data
<chr> <list>
1 Ackbar <tibble [1 x 12~
2 Adi Gallia <tibble [1 x 12~
3 Anakin Skywalker <tibble [1 x 12~
4 Arvel Crynyd <tibble [1 x 12~
5 Ayla Secura <tibble [1 x 12~
6 Bail Prestor Organa <tibble [1 x 12~
7 Barriss Offee <tibble [1 x 12~
8 BB8 <tibble [1 x 12~
9 Ben Quadinaros <tibble [1 x 12~
10 Beru Whitesun lars <tibble [1 x 12~
# ... with 77 more rows
###group_split関数
group_nest関数と同じく、グルーピングしてデータフレームを分割する関数で、グルーピングした結果をlist型で返す関数です。
split関数と同じですね。
#(パッケージのインストール等は省略)
#データフレームをグルーピングしてリストで返す
x <- starwars %>>%
group_by(gender) %>>%
group_split() %>>%
print()
実行結果は以下になります。
name height mass hair_color
<chr> <int> <dbl> <chr>
1 IG-88 200 140 none
2 BB8 NA NA none
# ... with 9 more variables:
# skin_color <chr>, eye_color <chr>,
# birth_year <dbl>, gender <chr>,
# homeworld <chr>, species <chr>,
# films <list>, vehicles <list>,
# starships <list>
###group_keys関数
グループのキー情報を取得する関数です。
#(パッケージのインストール等は省略)
#グループのキー情報を取得する
x <- starwars %>>%
group_by(name) %>>%
group_keys() %>>%
print()
実行結果です。
name
<chr>
1 Ackbar
2 Adi Gallia
3 Anakin Skywalker
4 Arvel Crynyd
5 Ayla Secura
6 Bail Prestor Organa
7 Barriss Offee
8 BB8
9 Ben Quadinaros
10 Beru Whitesun lars
# ... with 77 more rows
###group_rows関数
グループのインデックス情報をlist型で返す関数です。
#(パッケージのインストール等は省略)
#グループの行のインデックスをリストで返す
x <- starwars %>>%
group_by(gender) %>>%
group_rows() %>>%
print()
実行結果です。
[[1]]
[1] 2 3 8
[[2]]
[1] 5 7 27 41 44 52 58 61 62 63 67 70 71 73 76 80 83 86 87
[[3]]
[1] 16
[[4]]
[1] 1 4 6 9 10 11 12 13 14 15 17 18 19 20 21 23 24 25 26 28 29 30 31 32 33 34 35
[28] 36 37 38 39 40 42 43 45 46 47 48 49 50 51 53 54 55 56 57 59 60 64 65 66 68 69 72
[55] 74 75 77 78 79 81 82 84
[[5]]
[1] 22 85
###group_map関数
dplyr新バージョンにおける一番の目玉ではないでしょうか。
do関数の代替といった感じです。
2017年の時点ではHadley Wickhamがdoについてコミュニティで「機能改善はしないし、ドキュメントやチュートリアルでも言及しないけど、あと数年は残り続けるんじゃない?」みたいな事を言ってましたが、この関数が登場したこともあって近いうちに統廃合される感じなのでしょうか。
#(パッケージのインストール等は省略)
#以下はgenderでグルーピングしてカテゴリごとの先頭2行を抽出
x<- starwars %>%
group_by(gender) %>%
group_map(~ head(.x, 2)) %>>%
print()
実行結果です。
gender name height mass hair_color skin_color eye_color birth_year homeworld
<chr> <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr>
1 NA C-3PO 167 75 NA gold yellow 112 Tatooine
2 NA R2-D2 96 32 NA white, bl~ red 33 Naboo
3 female Leia~ 150 49 brown light brown 19 Alderaan
4 female Beru~ 165 75 brown light blue 47 Tatooine
5 herma~ Jabb~ 175 1358 NA green-tan~ orange 600 Nal Hutta
6 male Luke~ 172 77 blond fair blue 19 Tatooine
7 male Dart~ 202 136 none white yellow 41.9 Tatooine
8 none IG-88 200 140 none metal red 15 NA
9 none BB8 NA NA none none black NA NA
# ... with 4 more variables: species <chr>, films <list>, vehicles <list>,
# starships <list>
以上です。
最後のgroup_map関数は今後はdoの代替手段としてアップデートされていきそうな予感。
追いかけるのは大変ですが、やっていきましょう。