LoginSignup
7

More than 3 years have passed since last update.

【R言語】dplyr 0.8の新関数(group_by関数周り)をつかってみた

Posted at

ちょっと、というかかなり出遅れた感がありますが、今更ながらdplyrの仕様を再び追いかけはじめました。今年に入ってdplyrがバージョンアップされたらしく、新しい関数が追加されたということでコマンドを叩いてみました。
所感としてgroup_by関数が知っていたのと大分違う感じになったなー、と。
触ってみたついでに新しく追加された関数を紹介していきたいと思います。

group_nest関数

group_nest関数はグルーピングして入れ子にしたデータフレームの列を追加する関数です。
今回、dplyrが提供しているstarwarsのデータフレームをサンプルとして使用しています。

new_dplyr.r
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関数と同じですね。

new_dplyr.r
#(パッケージのインストール等は省略)

#データフレームをグルーピングしてリストで返す
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関数

グループのキー情報を取得する関数です。

new_dplyr.r
#(パッケージのインストール等は省略)

#グループのキー情報を取得する
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型で返す関数です。

new_dplyr.r
#(パッケージのインストール等は省略)

#グループの行のインデックスをリストで返す
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についてコミュニティで「機能改善はしないし、ドキュメントやチュートリアルでも言及しないけど、あと数年は残り続けるんじゃない?」みたいな事を言ってましたが、この関数が登場したこともあって近いうちに統廃合される感じなのでしょうか。

new_dplyr.r
#(パッケージのインストール等は省略)
#以下は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の代替手段としてアップデートされていきそうな予感。
追いかけるのは大変ですが、やっていきましょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7