kazutan.Rでdplyrのselectとmutateのセマンティクスの違いについてLTしてきました

「Rを用いたデータハンドリングと可視化」ハンズオン&LTa.k.a. kazutan.R)でLTしてきました。

speakerdeck.com

これは、dplyr 0.7.0のリリース時にvignetteに追加された内容です。和訳を更新しているときに読んで、なるほどなあと思ったので紹介してみました。なので、↑のスライドで話したのはこのvignetteに書かれている内容です。よければこちらも併せてお読みください。

個人的な学び

ちなみに、今日のkazutan.Rでの学びは、select()では1つの引数に複数の列を指定できることでした。

library("dplyr", quietly = TRUE)

select(iris, col = c(1, 5))  %>% head
#>   col1   col2
#> 1  5.1 setosa
#> 2  4.9 setosa
#> 3  4.7 setosa
#> 4  4.6 setosa
#> 5  5.0 setosa
#> 6  5.4 setosa

select(iris, col = c(Sepal.Length, Species)) %>% head
#>   col1   col2
#> 1  5.1 setosa
#> 2  4.9 setosa
#> 3  4.7 setosa
#> 4  4.6 setosa
#> 5  5.0 setosa
#> 6  5.4 setosa

知らなかった…。

こんな感じで、具体的にどの列がどの順番で選ばれたのかも分からないまま新しい列名にすることすらできます。よい子はマネしないでね感。

select(iris, col = starts_with("s")) %>% head
#>   col1 col2   col3
#> 1  5.1  3.5 setosa
#> 2  4.9  3.0 setosa
#> 3  4.7  3.2 setosa
#> 4  4.6  3.1 setosa
#> 5  5.0  3.6 setosa
#> 6  5.4  3.9 setosa

勉強になりました。

余談

余談ですが、rename()もselectのセマンティクスです、と言ったものの、どうもしっくりこない違いがあります。例えば、以下はエラーになります。

rename(iris, x = 1)
#> Error: `x` = 1 must be a symbol or a string, not a double vector

select(iris, x = 1)は問題なくできる、というか、まさにこの列の位置を表すことこそがselectのセマンティクスの本質のはずなので、なぜ??と混乱しています。とりあえずissueを立てたりしてみたんですが、これをrename()ではエラーにしなければならない理由をご存知の方、教えてください。ほんとに悩んでいます…