tidyverse での関数化tips

SendaiR 02 @fuuuumin

2019 / 09 / 28

Introduction

whoami

fuuuumin314

@twitter

中級者向けの発表を目指す

R歴: 5年, 医学データの解析

研修医

tidyverse 使っていますか?

  • Dataに対するactionに集中することができる
  • CLIで使いやすい
  • 処理が早い

一方で関数化するのは少し面倒

  • !!enquo(variable)
  • !!!enquos(variable)
  • ここで説明するには時間が短すぎる

3つの改善方法

  1. .dataの切り出し
  2. dots(…)でパラメータを渡す
  3. argsを使いこなす

.dataの切り出し

Calculate average for each group

  • 各levelの平均を算出する
## # A tibble: 2 x 2
##   smoke   avg
##   <int> <dbl>
## 1     0 3056.
## 2     1 2772.

変数をstringとして表現するには

  • baseRの[[]]を使って
## # A tibble: 2 x 2
##   smoke   avg
##   <int> <dbl>
## 1     0 3056.
## 2     1 2772.

関数化して

## # A tibble: 2 x 2
##   smoke   avg
##   <int> <dbl>
## 1     0 3056.
## 2     1 2772.

dots(…)でパラメータを渡す

dots(…)

  • 1回だけならquotingなしで引数をとれる
  • 複数の名前あり/なしの引数をとれる

Count for each group

  • 各levelのサンプルサイズを出す
## # A tibble: 35 x 3
## # Groups:   cut [5]
##    cut   color count
##    <ord> <ord> <int>
##  1 Fair  D       163
##  2 Fair  E       224
##  3 Fair  F       312
##  4 Fair  G       314
##  5 Fair  H       303
##  6 Fair  I       175
##  7 Fair  J       119
##  8 Good  D       662
##  9 Good  E       933
## 10 Good  F       909
## # … with 25 more rows

group_countと関数化

確認

## # A tibble: 35 x 3
## # Groups:   cut [5]
##    cut   color count
##    <ord> <ord> <int>
##  1 Fair  D       163
##  2 Fair  E       224
##  3 Fair  F       312
##  4 Fair  G       314
##  5 Fair  H       303
##  6 Fair  I       175
##  7 Fair  J       119
##  8 Good  D       662
##  9 Good  E       933
## 10 Good  F       909
## # … with 25 more rows

実行時に新しい変数を定義できる

## # A tibble: 3 x 2
##   carat_3     count
##   <fct>       <int>
## 1 (0.195,1.8] 51666
## 2 (1.8,3.41]   2264
## 3 (3.41,5.01]    10

もしの複数の変数でdotsを使いたいなら

ここを参照して

{{args}}を使いこなす

{{args}}

  • ただの!!enquo(args)のショートカット
  • gluepackageの{}から
## I am 20 years old!

クロス表

  • table()もあるが、NAを無視してしまう
## # A tibble: 5 x 8
## # Groups:   cut [5]
##   cut           D     E     F     G     H     I     J
##   <ord>     <int> <int> <int> <int> <int> <int> <int>
## 1 Fair        163   224   312   314   303   175   119
## 2 Good        662   933   909   871   702   522   307
## 3 Very Good  1513  2400  2164  2299  1824  1204   678
## 4 Premium    1603  2337  2331  2924  2360  1428   808
## 5 Ideal      2834  3903  3826  4884  3115  2093   896

関数化して

確認

## # A tibble: 5 x 8
## # Groups:   cut [5]
##   cut           D     E     F     G     H     I     J
##   <ord>     <int> <int> <int> <int> <int> <int> <int>
## 1 Fair        163   224   312   314   303   175   119
## 2 Good        662   933   909   871   702   522   307
## 3 Very Good  1513  2400  2164  2299  1824  1204   678
## 4 Premium    1603  2337  2331  2924  2360  1428   808
## 5 Ideal      2834  3903  3826  4884  3115  2093   896

Appendix

reference

Environment info

##  setting  value                       
##  version  R version 3.6.1 (2019-07-05)
##  os       Ubuntu 18.04.3 LTS          
##  system   x86_64, linux-gnu           
##  ui       X11                         
##  language ja                          
##  collate  ja_JP.UTF-8                 
##  ctype    ja_JP.UTF-8                 
##  tz       Asia/Tokyo                  
##  date     2019-09-28

##  package     * version date       lib source        
##  assertthat    0.2.1   2019-03-21 [1] CRAN (R 3.6.0)
##  backports     1.1.4   2019-04-10 [1] CRAN (R 3.6.0)
##  broom         0.5.2   2019-04-07 [1] CRAN (R 3.6.0)
##  callr         3.2.0   2019-03-15 [1] CRAN (R 3.6.0)
##  cellranger    1.1.0   2016-07-27 [1] CRAN (R 3.6.0)
##  cli           1.1.0   2019-03-19 [1] CRAN (R 3.6.0)
##  codetools     0.2-16  2018-12-24 [4] CRAN (R 3.5.2)
##  colorspace    1.4-1   2019-03-18 [1] CRAN (R 3.6.0)
##  crayon        1.3.4   2017-09-16 [1] CRAN (R 3.6.0)
##  desc          1.2.0   2018-05-01 [1] CRAN (R 3.6.0)
##  devtools      2.2.1   2019-09-24 [1] CRAN (R 3.6.1)
##  digest        0.6.18  2018-10-10 [1] CRAN (R 3.6.0)
##  dplyr       * 0.8.3   2019-07-04 [1] CRAN (R 3.6.1)
##  ellipsis      0.3.0   2019-09-20 [1] CRAN (R 3.6.1)
##  evaluate      0.13    2019-02-12 [1] CRAN (R 3.6.0)
##  fansi         0.4.0   2018-10-05 [1] CRAN (R 3.6.0)
##  forcats     * 0.4.0   2019-02-17 [1] CRAN (R 3.6.0)
##  fs            1.2.7   2019-03-19 [1] CRAN (R 3.6.0)
##  generics      0.0.2   2018-11-29 [1] CRAN (R 3.6.0)
##  ggplot2     * 3.1.1   2019-04-07 [1] CRAN (R 3.6.0)
##  glue          1.3.1   2019-03-12 [1] CRAN (R 3.6.0)
##  gtable        0.3.0   2019-03-25 [1] CRAN (R 3.6.0)
##  haven         2.1.0   2019-02-19 [1] CRAN (R 3.6.0)
##  hms           0.4.2   2018-03-10 [1] CRAN (R 3.6.0)
##  htmltools     0.3.6   2017-04-28 [1] CRAN (R 3.6.0)
##  httr          1.4.0   2018-12-11 [1] CRAN (R 3.6.0)
##  jsonlite      1.6     2018-12-07 [1] CRAN (R 3.6.0)
##  knitr         1.25    2019-09-18 [1] CRAN (R 3.6.1)
##  lattice       0.20-38 2018-11-04 [4] CRAN (R 3.5.1)
##  lazyeval      0.2.2   2019-03-15 [1] CRAN (R 3.6.0)
##  lifecycle     0.1.0   2019-08-01 [1] CRAN (R 3.6.1)
##  lubridate     1.7.4   2018-04-11 [1] CRAN (R 3.6.0)
##  magrittr      1.5     2014-11-22 [1] CRAN (R 3.6.0)
##  memoise       1.1.0   2017-04-21 [1] CRAN (R 3.6.0)
##  modelr        0.1.4   2019-02-18 [1] CRAN (R 3.6.0)
##  munsell       0.5.0   2018-06-12 [1] CRAN (R 3.6.0)
##  nlme          3.1-141 2019-08-01 [4] CRAN (R 3.6.1)
##  pillar        1.3.1   2018-12-15 [1] CRAN (R 3.6.0)
##  pkgbuild      1.0.3   2019-03-20 [1] CRAN (R 3.6.0)
##  pkgconfig     2.0.2   2018-08-16 [1] CRAN (R 3.6.0)
##  pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.6.0)
##  plyr          1.8.4   2016-06-08 [1] CRAN (R 3.6.0)
##  prettyunits   1.0.2   2015-07-13 [1] CRAN (R 3.6.0)
##  processx      3.3.0   2019-03-10 [1] CRAN (R 3.6.0)
##  ps            1.3.0   2018-12-21 [1] CRAN (R 3.6.0)
##  purrr       * 0.3.2   2019-03-15 [1] CRAN (R 3.6.0)
##  R6            2.4.0   2019-02-14 [1] CRAN (R 3.6.0)
##  Rcpp          1.0.1   2019-03-17 [1] CRAN (R 3.6.0)
##  readr       * 1.3.1   2018-12-21 [1] CRAN (R 3.6.0)
##  readxl        1.3.1   2019-03-13 [1] CRAN (R 3.6.0)
##  remotes       2.1.0   2019-06-24 [1] CRAN (R 3.6.1)
##  revealjs      0.9     2017-03-13 [1] CRAN (R 3.6.0)
##  rlang         0.4.0   2019-06-25 [1] CRAN (R 3.6.1)
##  rmarkdown     1.15    2019-08-21 [1] CRAN (R 3.6.1)
##  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.6.0)
##  rstudioapi    0.10    2019-03-19 [1] CRAN (R 3.6.0)
##  rvest         0.3.3   2019-04-11 [1] CRAN (R 3.6.0)
##  scales        1.0.0   2018-08-09 [1] CRAN (R 3.6.0)
##  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.6.0)
##  stringi       1.4.3   2019-03-12 [1] CRAN (R 3.6.0)
##  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 3.6.0)
##  testthat      2.2.1   2019-07-25 [1] CRAN (R 3.6.1)
##  tibble      * 2.1.1   2019-03-16 [1] CRAN (R 3.6.0)
##  tidyr       * 1.0.0   2019-09-11 [1] CRAN (R 3.6.1)
##  tidyselect    0.2.5   2018-10-11 [1] CRAN (R 3.6.0)
##  tidyverse   * 1.2.1   2017-11-14 [1] CRAN (R 3.6.1)
##  usethis       1.5.0   2019-04-07 [1] CRAN (R 3.6.0)
##  utf8          1.1.4   2018-05-24 [1] CRAN (R 3.6.0)
##  vctrs         0.2.0   2019-07-05 [1] CRAN (R 3.6.1)
##  withr         2.1.2   2018-03-15 [1] CRAN (R 3.6.0)
##  xfun          0.6     2019-04-02 [1] CRAN (R 3.6.0)
##  xml2          1.2.0   2018-01-24 [1] CRAN (R 3.6.0)
##  yaml          2.2.0   2018-07-25 [1] CRAN (R 3.6.0)
##  zeallot       0.1.0   2018-01-28 [1] CRAN (R 3.6.1)
## 
## [1] /home/fuuuumin/R/x86_64-pc-linux-gnu-library/3.6
## [2] /usr/local/lib/R/site-library
## [3] /usr/lib/R/site-library
## [4] /usr/lib/R/library