5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

dplyr Version 1.0.0 新機能 1

Last updated at Posted at 2020-06-14

はじめに

ついにdplyrのVersion 1.0.0がCRANにリリースされました!!
以前のdplyrと挙動が大きく変わっておりますので、主な新しい機能をまとめたいと思います。

dplyrとは?

表データをさくさく処理するためのRのパッケージのこと。
これを使うともうpandasには戻れない。。。(個人の感想です)

インストール&ロード

まずは、tidyverseを以下のコードでインストール&ロードしましょう。
※tidyverseは、データ処理を簡単にしてくれるパッケージ群の総称でその中の一つがdplyrです。

install.packages("tidyverse")
library(tidyverse)

データ

本記事で使用するデータは、みんな大好き、diamondsです!

diamonds

# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows

summarise

summariseは旧バージョンでは、主にgroup_byでグルーピングした後の基本統計量(合計とか平均)を算出するのに使用されていました。
旧バージョンでは、関数を適用した後の出力が、スカラー(要素数が1のベクトル)となる関数しか使用することができませんでした。

diamonds %>% 
  group_by(color) %>% 
  summarise(price_mean = mean(price))

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 2
  color price_mean
  <ord>      <dbl>
1 D          3170.
2 E          3077.
3 F          3725.
4 G          3999.
5 H          4487.
6 I          5092.
7 J          5324.

新バージョンでは、出力がベクトルやtibbleでも受け付けてくれます!

diamonds %>% 
  group_by(color) %>% 
  summarise(price_range = range(price))

`summarise()` regrouping output by 'color' (override with `.groups` argument)
# A tibble: 14 x 2
# Groups:   color [7]
   color price_range
   <ord>       <int>
 1 D             357
 2 D           18693
 3 E             326
 4 E           18731
 5 F             342
 6 F           18791
 7 G             354
 8 G           18818
 9 H             337
10 H           18803
11 I             334
12 I           18823
13 J             335
14 J           18710
diamonds %>% 
  group_by(color) %>% 
  summarise(tibble(min = min(price), max = max(price)))

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 3
  color   min   max
  <ord> <int> <int>
1 D       357 18693
2 E       326 18731
3 F       342 18791
4 G       354 18818
5 H       337 18803
6 I       334 18823
7 J       335 18710

select

指定の列を抽出します。
列を型で指定するのが旧バージョンに比べて楽になりました。

#numeric型の列を抽出する
diamonds %>% 
  select(where(is.numeric))

# A tibble: 53,940 x 7
   carat depth table price     x     y     z
   <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23   61.5    55   326  3.95  3.98  2.43
 2 0.21   59.8    61   326  3.89  3.84  2.31
 3 0.23   56.9    65   327  4.05  4.07  2.31
 4 0.290  62.4    58   334  4.2   4.23  2.63
 5 0.31   63.3    58   335  4.34  4.35  2.75
 6 0.24   62.8    57   336  3.94  3.96  2.48
 7 0.24   62.3    57   336  3.95  3.98  2.47
 8 0.26   61.9    55   337  4.07  4.11  2.53
 9 0.22   65.1    61   337  3.87  3.78  2.49
10 0.23   59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows
#numeric型以外の列を抽出する
diamonds %>% 
  select(!where(is.numeric))

# A tibble: 53,940 x 3
   cut       color clarity
   <ord>     <ord> <ord>  
 1 Ideal     E     SI2    
 2 Premium   E     SI1    
 3 Good      E     VS1    
 4 Premium   I     VS2    
 5 Good      J     SI2    
 6 Very Good J     VVS2   
 7 Very Good I     VVS1   
 8 Very Good H     SI1    
 9 Fair      E     VS2    
10 Very Good H     VS1    
# ... with 53,930 more rows

もちろん、旧バージョンのstarts_withなどと併用することも可能!!

#numeric型でかつ、列名の先頭がpの列を抽出する
diamonds %>% 
  select(where(is.numeric) & starts_with("p"))

# A tibble: 53,940 x 1
   price
   <int>
 1   326
 2   326
 3   327
 4   334
 5   335
 6   336
 7   336
 8   337
 9   337
10   338
# ... with 53,930 more rows

  

rename

rename_withで以前よりも簡単にリネームできるように。

#すべての列名を大文字にする
diamonds %>% 
  rename_with(toupper)

# A tibble: 53,940 x 10
   CARAT CUT       COLOR CLARITY DEPTH TABLE PRICE     X     Y     Z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows

列名を指定することも可能

#color, priceを大文字にする
diamonds %>% 
  rename_with(toupper, c(color, price))

# A tibble: 53,940 x 10
   carat cut       COLOR clarity depth table PRICE     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows
#numeric型を大文字にする
diamonds %>% 
  rename_with(toupper, where(is.numeric))

# A tibble: 53,940 x 10
   CARAT cut       color clarity DEPTH TABLE PRICE     X     Y     Z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows

relocate

relocateは、新バージョンからの新しい関数で列の順番を変えるときに使用する。
以前はselectで頑張って列の順番を変えていたが、relocateを使うとより簡単にできるかも。

#y,zを前に持ってくる
diamonds %>% 
  relocate(y, z)

# A tibble: 53,940 x 10
       y     z carat cut       color clarity depth table price     x
   <dbl> <dbl> <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl>
 1  3.98  2.43 0.23  Ideal     E     SI2      61.5    55   326  3.95
 2  3.84  2.31 0.21  Premium   E     SI1      59.8    61   326  3.89
 3  4.07  2.31 0.23  Good      E     VS1      56.9    65   327  4.05
 4  4.23  2.63 0.290 Premium   I     VS2      62.4    58   334  4.2 
 5  4.35  2.75 0.31  Good      J     SI2      63.3    58   335  4.34
 6  3.96  2.48 0.24  Very Good J     VVS2     62.8    57   336  3.94
 7  3.98  2.47 0.24  Very Good I     VVS1     62.3    57   336  3.95
 8  4.11  2.53 0.26  Very Good H     SI1      61.9    55   337  4.07
 9  3.78  2.49 0.22  Fair      E     VS2      65.1    61   337  3.87
10  4.05  2.39 0.23  Very Good H     VS1      59.4    61   338  4   
# ... with 53,930 more rows
#numeric型を前に持ってくる
diamonds %>% 
  relocate(where(is.numeric))

# A tibble: 53,940 x 10
   carat depth table price     x     y     z cut       color clarity
   <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <ord>     <ord> <ord>  
 1 0.23   61.5    55   326  3.95  3.98  2.43 Ideal     E     SI2    
 2 0.21   59.8    61   326  3.89  3.84  2.31 Premium   E     SI1    
 3 0.23   56.9    65   327  4.05  4.07  2.31 Good      E     VS1    
 4 0.290  62.4    58   334  4.2   4.23  2.63 Premium   I     VS2    
 5 0.31   63.3    58   335  4.34  4.35  2.75 Good      J     SI2    
 6 0.24   62.8    57   336  3.94  3.96  2.48 Very Good J     VVS2   
 7 0.24   62.3    57   336  3.95  3.98  2.47 Very Good I     VVS1   
 8 0.26   61.9    55   337  4.07  4.11  2.53 Very Good H     SI1    
 9 0.22   65.1    61   337  3.87  3.78  2.49 Fair      E     VS2    
10 0.23   59.4    61   338  4     4.05  2.39 Very Good H     VS1    
# ... with 53,930 more rows

位置を細かく指定したい場合は、.afterや.beforeを使用する

#priceの後にyを持ってくる
diamonds %>% 
  relocate(y, .after = price)

# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     y     x     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.98  3.95  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.84  3.89  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.07  4.05  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.23  4.2   2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.35  4.34  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.96  3.94  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.98  3.95  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.11  4.07  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.78  3.87  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4.05  4     2.39
# ... with 53,930 more rows
#priceの前にyを持ってくる
diamonds %>% 
  relocate(y, .before = price)

# A tibble: 53,940 x 10
   carat cut       color clarity depth table     y price     x     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <dbl> <int> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55  3.98   326  3.95  2.43
 2 0.21  Premium   E     SI1      59.8    61  3.84   326  3.89  2.31
 3 0.23  Good      E     VS1      56.9    65  4.07   327  4.05  2.31
 4 0.290 Premium   I     VS2      62.4    58  4.23   334  4.2   2.63
 5 0.31  Good      J     SI2      63.3    58  4.35   335  4.34  2.75
 6 0.24  Very Good J     VVS2     62.8    57  3.96   336  3.94  2.48
 7 0.24  Very Good I     VVS1     62.3    57  3.98   336  3.95  2.47
 8 0.26  Very Good H     SI1      61.9    55  4.11   337  4.07  2.53
 9 0.22  Fair      E     VS2      65.1    61  3.78   337  3.87  2.49
10 0.23  Very Good H     VS1      59.4    61  4.05   338  4     2.39
# ... with 53,930 more rows
#最後の列の後にyを持ってくる
diamonds %>% 
  relocate(y, .after = last_col())

# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     z     y
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  2.43  3.98
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  2.31  3.84
 3 0.23  Good      E     VS1      56.9    65   327  4.05  2.31  4.07
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   2.63  4.23
 5 0.31  Good      J     SI2      63.3    58   335  4.34  2.75  4.35
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  2.48  3.96
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  2.47  3.98
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  2.53  4.11
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  2.49  3.78
10 0.23  Very Good H     VS1      59.4    61   338  4     2.39  4.05
# ... with 53,930 more rows

その他

ここでまとめたものは新バージョンのごく一部にすぎません!
私もまだほとんど把握できていないため、分かり次第、都度都度更新していく予定です!

SESSION INFORMATION

- Session info -------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.6.3 (2020-02-29)
 os       Windows >= 8 x64            
 system   x86_64, mingw32             
 ui       RStudio                     
 language (EN)                        
 collate  Japanese_Japan.932          
 ctype    Japanese_Japan.932          
 tz       Asia/Tokyo                  
 date     2020-06-14                  

- Packages -----------------------------------------------------------------------------------------------------------------------
 package     * version date       lib source        
 assertthat    0.2.1   2019-03-21 [1] CRAN (R 3.6.3)
 backports     1.1.7   2020-05-13 [1] CRAN (R 3.6.3)
 blob          1.2.1   2020-01-20 [1] CRAN (R 3.6.3)
 broom         0.5.6   2020-04-20 [1] CRAN (R 3.6.3)
 callr         3.4.3   2020-03-28 [1] CRAN (R 3.6.3)
 cellranger    1.1.0   2016-07-27 [1] CRAN (R 3.6.3)
 cli           2.0.2   2020-02-28 [1] CRAN (R 3.6.3)
 colorspace    1.4-1   2019-03-18 [1] CRAN (R 3.6.3)
 crayon        1.3.4   2017-09-16 [1] CRAN (R 3.6.3)
 DBI           1.1.0   2019-12-15 [1] CRAN (R 3.6.3)
 dbplyr        1.4.4   2020-05-27 [1] CRAN (R 3.6.3)
 desc          1.2.0   2018-05-01 [1] CRAN (R 3.6.3)
 devtools      2.3.0   2020-04-10 [1] CRAN (R 3.6.3)
 digest        0.6.25  2020-02-23 [1] CRAN (R 3.6.3)
 dplyr       * 1.0.0   2020-05-29 [1] CRAN (R 3.6.3)
 ellipsis      0.3.1   2020-05-15 [1] CRAN (R 3.6.3)
 evaluate      0.14    2019-05-28 [1] CRAN (R 3.6.3)
 fansi         0.4.1   2020-01-08 [1] CRAN (R 3.6.3)
 forcats     * 0.5.0   2020-03-01 [1] CRAN (R 3.6.3)
 fs            1.4.1   2020-04-04 [1] CRAN (R 3.6.3)
 generics      0.0.2   2018-11-29 [1] CRAN (R 3.6.3)
 ggplot2     * 3.3.1   2020-05-28 [1] CRAN (R 3.6.3)
 glue          1.4.1   2020-05-13 [1] CRAN (R 3.6.3)
 gtable        0.3.0   2019-03-25 [1] CRAN (R 3.6.3)
 haven         2.3.1   2020-06-01 [1] CRAN (R 3.6.3)
 hms           0.5.3   2020-01-08 [1] CRAN (R 3.6.3)
 htmltools     0.4.0   2019-10-04 [1] CRAN (R 3.6.3)
 httr          1.4.1   2019-08-05 [1] CRAN (R 3.6.3)
 jsonlite      1.6.1   2020-02-02 [1] CRAN (R 3.6.3)
 knitr         1.28    2020-02-06 [1] CRAN (R 3.6.3)
 lattice       0.20-38 2018-11-04 [2] CRAN (R 3.6.3)
 lifecycle     0.2.0   2020-03-06 [1] CRAN (R 3.6.3)
 lubridate     1.7.9   2020-06-08 [1] CRAN (R 3.6.3)
 magrittr      1.5     2014-11-22 [1] CRAN (R 3.6.3)
 memoise       1.1.0   2017-04-21 [1] CRAN (R 3.6.3)
 modelr        0.1.8   2020-05-19 [1] CRAN (R 3.6.3)
 munsell       0.5.0   2018-06-12 [1] CRAN (R 3.6.3)
 nlme          3.1-144 2020-02-06 [2] CRAN (R 3.6.3)
 pillar        1.4.4   2020-05-05 [1] CRAN (R 3.6.3)
 pkgbuild      1.0.8   2020-05-07 [1] CRAN (R 3.6.3)
 pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 3.6.3)
 pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.6.3)
 prettyunits   1.1.1   2020-01-24 [1] CRAN (R 3.6.3)
 processx      3.4.2   2020-02-09 [1] CRAN (R 3.6.3)
 ps            1.3.3   2020-05-08 [1] CRAN (R 3.6.3)
 purrr       * 0.3.4   2020-04-17 [1] CRAN (R 3.6.3)
 R6            2.4.1   2019-11-12 [1] CRAN (R 3.6.3)
 Rcpp          1.0.4.6 2020-04-09 [1] CRAN (R 3.6.3)
 readr       * 1.3.1   2018-12-21 [1] CRAN (R 3.6.3)
 readxl        1.3.1   2019-03-13 [1] CRAN (R 3.6.3)
 remotes       2.1.1   2020-02-15 [1] CRAN (R 3.6.3)
 renv          0.10.0  2020-05-06 [1] CRAN (R 3.6.3)
 reprex        0.3.0   2019-05-16 [1] CRAN (R 3.6.3)
 rlang         0.4.6   2020-05-02 [1] CRAN (R 3.6.3)
 rmarkdown     2.1     2020-01-20 [1] CRAN (R 3.6.3)
 rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.6.3)
 rstudioapi    0.11    2020-02-07 [1] CRAN (R 3.6.3)
 rvest         0.3.5   2019-11-08 [1] CRAN (R 3.6.3)
 scales        1.1.1   2020-05-11 [1] CRAN (R 3.6.3)
 sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.6.3)
 stringi       1.4.6   2020-02-17 [1] CRAN (R 3.6.2)
 stringr     * 1.4.0   2019-02-10 [1] CRAN (R 3.6.3)
 testthat      2.3.2   2020-03-02 [1] CRAN (R 3.6.3)
 tibble      * 3.0.1   2020-04-20 [1] CRAN (R 3.6.3)
 tidyr       * 1.1.0   2020-05-20 [1] CRAN (R 3.6.3)
 tidyselect    1.1.0   2020-05-11 [1] CRAN (R 3.6.3)
 tidyverse   * 1.3.0   2019-11-21 [1] CRAN (R 3.6.3)
 usethis       1.6.1   2020-04-29 [1] CRAN (R 3.6.3)
 utf8          1.1.4   2018-05-24 [1] CRAN (R 3.6.3)
 vctrs         0.3.0   2020-05-11 [1] CRAN (R 3.6.3)
 withr         2.2.0   2020-04-20 [1] CRAN (R 3.6.3)
 xfun          0.13    2020-04-13 [1] CRAN (R 3.6.3)
 xml2          1.3.2   2020-04-23 [1] CRAN (R 3.6.3)
 yaml          2.2.1   2020-02-01 [1] CRAN (R 3.6.3)
5
5
0

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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?