dplyr Version 1.0.0 新機能 1



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

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

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

```{r eval=FALSE, include=FALSE}
install.packages("tidyverse")
library(tidyverse)
```


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

```{r}
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のベクトル）となる関数しか使用することができませんでした。

```{r}
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でも受け付けてくれます！

```{r}
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
```

```{r}
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


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

```{r}
#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
```



```{r}
#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などと併用することも可能!!

```{r}
#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で以前よりも簡単にリネームできるように。


```{r}
#すべての列名を大文字にする
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
```


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

```{r}
#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
```

```{r}
#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を使うとより簡単にできるかも。


```{r}
#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
```

```{r}
#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を使用する

```{r}
#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
```

```{r}
#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
```

```{r}
#最後の列の後に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

```{r}
- 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)
```