Programming with tidyr

イントロダクション

ほとんどのtidyr動詞は、インタラクティブなデータ探索を高速かつ流動的にするためにtidy評価を使用する。tidy評価とは、tidyverse全体で使用される非標準の評価の特別なタイプである。ここにいくつかの典型的なtidyrのコードがある。

library(tidyr)

iris %>%
  nest(data = !Species)
#> # A tibble: 3 × 2
#>   Species    data             
#>   <fct>      <list>           
#> 1 setosa     <tibble [50 × 4]>
#> 2 versicolor <tibble [50 × 4]>
#> 3 virginica  <tibble [50 × 4]>

!Species を使って「 Species を除くすべての列」と言えば、列名を引用したり ( "Species" ) 、囲んだデータフレームを参照したり ( iris$Species ) する必要がないのは、整頓された評価のおかげである。

tidyrでは、2つの基本的な評価形式が使われている。

ここでは、最も一般的であるため、tidy選択に焦点を当てる。データマスキングについては、dplyrの同等のvignetteで詳しく学ぶことができる。<https://dplyr.tidyverse.org/dev/articles/programming.html>;.パッケージでtidyrのコードを書くときの他の考慮事項については。vignette("in-packages") を参照してみよう。

tidyrの整然とした評価インターフェースは、対話的な探索のために最適化されていることを指摘した。裏を返せば、これは間接的な使用、すなわち for ループや関数の内部で作業しているときに、いくつかの課題を追加するということである。この vignette では、そのような課題を克服する方法を紹介する。まず、tidy選択とデータマスキングの基本を説明し、それらを間接的に使用する方法について話し、そして一般的な問題を解決するためのいくつかのレシピを紹介する。

先に進む前に、使用しているtidyrのバージョンを明らかにし、例で使用するための小さなデータセットを作成する。

packageVersion("tidyr")
#> [1] '1.2.0'

mini_iris <- as_tibble(iris)[c(1, 2, 51, 52, 101, 102), ]
mini_iris
#> # A tibble: 6 × 5
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
#>          <dbl>       <dbl>        <dbl>       <dbl> <fct>     
#> 1          5.1         3.5          1.4         0.2 setosa    
#> 2          4.9         3            1.4         0.2 setosa    
#> 3          7           3.2          4.7         1.4 versicolor
#> 4          6.4         3.2          4.5         1.5 versicolor
#> 5          6.3         3.3          6           2.5 virginica 
#> 6          5.8         2.7          5.1         1.9 virginica

tidy selection

tidy選択を使用するすべての関数の下には、 tidyselectパッケージがある。これは、名前、位置、またはタイプによって列を簡単に選択できる、ミニチュアのドメイン固有の言語を提供する。たとえば

詳しくは。?tidyr_tidy_select を参照。

方向性

tidy セレクションは、一般的なタスクを簡単にするが、その代償として、あまり一般的でないタスクを難しくする。中間変数に格納された列の仕様で間接的にtidy selectを使用したい場合、いくつかの新しいツールを学ぶ必要がある。これが出てくる主なケースは3つある。

多くの tidyr 関数は ... を使っているので、例えば fill(df, x, y, z) のように簡単に多くの変数を選択することができることに注意。私は今、このアプローチのデメリットはメリットを上回り、このインターフェイスは fill(df, c(x, y, z)) の方がよかったと思われる。列を選択する新しい関数については、引数を1つだけにして。... を使わないでみよう。