概要

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

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

starts_with(x, ignore.case = TRUE)

前方一致で変数を検索してまとめて持ってくる。

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にすると、大文字と小文字を区別してくれる

library(dplyr)
chitoge <- dplyr::select(iris, starts_with("sepal", ignore.case = FALSE))
head(chitoge)
##  0 列 6 行のデータフレーム

ends_with(x, ignore.case = TRUE)

後方一致で変数を検索してまとめて持ってくる。

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)

部分一致で変数を検索してまとめて持ってくる。

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)

正規表現で指定してマッチする変数をまとめて持ってくる。

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まで」といったような、連番の変数範囲を指定可能。
第一引数は“固定の文字列”、第二引数は“連番の数”、第三引数は“表示桁数”を意味する。

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"
dplyr::select(haru, num_range("wagashi", 1:3, 1))
##   wagashi1 wagashi2 wagashi3
## 1        1        4        7
## 2        2        5        8
## 3        3        6        9
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")

文字列ベクトルで変数リストを持ってくる。

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()

全部持ってくる。

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
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”と、あと残り全部」という意味になる。

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

?dplyr::select

以上。