dplyr::selectのSpecial Functionsについて

### 概要
`dplyr::select`のヘルプを見て不勉強を痛感したのでメモ。

この関数は「変数を選択する関数」なのだけれど、**この関数内だけで使える便利でスペシャルな関数**がいくつも組み込まれている。以下そのスペシャルな関数をコードと共にまとめてみた。

### `starts_with(x, ignore.case = TRUE)`
前方一致で変数を検索してまとめて持ってくる。


```r
library(dplyr)
chitoge <- dplyr::select(iris, starts_with("sepal"))
head(chitoge)
```

```
##   Sepal.Length Sepal.Width
## 1          5.1         3.5
## 2          4.9         3.0
## 3          4.7         3.2
## 4          4.6         3.1
## 5          5.0         3.6
## 6          5.4         3.9
```

なお`ignore.case = FALSE`にすると、大文字と小文字を区別してくれる

```r
library(dplyr)
chitoge <- dplyr::select(iris, starts_with("sepal", ignore.case = FALSE))
head(chitoge)
```

```
##  0 列 6 行のデータフレーム
```

### `ends_with(x, ignore.case = TRUE)`
後方一致で変数を検索してまとめて持ってくる。


```r
kosaki <- dplyr::select(iris, ends_with("width"))
head(kosaki)
```

```
##   Sepal.Width Petal.Width
## 1         3.5         0.2
## 2         3.0         0.2
## 3         3.2         0.2
## 4         3.1         0.2
## 5         3.6         0.2
## 6         3.9         0.4
```

### `contains(x, ignore.case = TRUE)`
部分一致で変数を検索してまとめて持ってくる。


```r
tsugumi <- dplyr::select(iris, contains("pe"))
head(tsugumi)
```

```
##   Petal.Length Petal.Width Species
## 1          1.4         0.2  setosa
## 2          1.4         0.2  setosa
## 3          1.3         0.2  setosa
## 4          1.5         0.2  setosa
## 5          1.4         0.2  setosa
## 6          1.7         0.4  setosa
```

### `matches(x, ignore.case = TRUE)`
正規表現で指定してマッチする変数をまとめて持ってくる。


```r
marika <- dplyr::select(iris, matches(".t."))
head(marika)
```

```
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4
```

### `num_range("x", 1:5, width = 2)`
「(固定の文字列)01から05まで」といったような、連番の変数範囲を指定可能。  
第一引数は"固定の文字列"、第二引数は"連番の数"、第三引数は"表示桁数"を意味する。


```r
haru <- as.data.frame(matrix(1:30, nrow = 3, ncol = 10))
colnames(haru) <- c(paste0("wagashi", 1:5), paste0("yougashi0", 1:5))
ls(haru)
```

```
##  [1] "wagashi1"   "wagashi2"   "wagashi3"   "wagashi4"   "wagashi5"  
##  [6] "yougashi01" "yougashi02" "yougashi03" "yougashi04" "yougashi05"
```

```r
dplyr::select(haru, num_range("wagashi", 1:3, 1))
```

```
##   wagashi1 wagashi2 wagashi3
## 1        1        4        7
## 2        2        5        8
## 3        3        6        9
```

```r
dplyr::select(haru, num_range("yougashi", 2:4, 2))
```

```
##   yougashi02 yougashi03 yougashi04
## 1         19         22         25
## 2         20         23         26
## 3         21         24         27
```

### `one_of("x", "y", "z")`
文字列ベクトルで変数リストを持ってくる。


```r
gyoza <- c("Petal.Length", "Sepal.Width")
yui <- dplyr::select(iris, one_of(gyoza))
head(yui)
```

```
##   Petal.Length Sepal.Width
## 1          1.4         3.5
## 2          1.4         3.0
## 3          1.3         3.2
## 4          1.5         3.1
## 5          1.4         3.6
## 6          1.7         3.9
```

なお、one_of()を使わずにそのまま放り込むとエラーになるので注意。

### `everything()`
全部持ってくる。


```r
cast <- as.data.frame(matrix(1:15, nrow = 3, ncol = 5))
colnames(cast) <- c("touyama", "hanazawa", "komatsu", "asumi", "sakura")
dplyr::select(cast, everything())
```

```
##   touyama hanazawa komatsu asumi sakura
## 1       1        4       7    10     13
## 2       2        5       8    11     14
## 3       3        6       9    12     15
```

```r
dplyr::select(cast, hanazawa, touyama, everything())
```

```
##   hanazawa touyama komatsu asumi sakura
## 1        4       1       7    10     13
## 2        5       2       8    11     14
## 3        6       3       9    12     15
```

2つ目の出力は、「"hanazawa"と"touyama"と、あと残り全部」という意味になる。

その他詳しいことは、この関数のヘルプを参照のこと。

```r
?dplyr::select
```

以上。