また、select()を使用した列を指定する方法は、tidyverseパッケージ内のselect()以外の関数で列を指定する方法としても利用できます。
目次
select()の概要
select()は、名前とタイプを使用して列を保持または削除する関数です。これは、名前(例: a:fは左のaから右のfまでのすべての列を選択)またはタイプ(例: where(is.numeric)はすべての数値列を選択)に基づいて変数を簡単に参照できる簡潔なミニ言語を使用して、データフレーム内の列を選択(およびオプションで名前を変更)します。
select()の使い方
まずは、dplyr::select()の使い方について確認しておきます。
select(.data, ...)
select()の引数の意味
データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。
カンマで区切られた引用符で囲まれていない1つ以上の式や後述の方法で指定します。
変数名は、データ フレーム内の位置であるかのように使用できるため、x:yのような式を使用して変数の範囲を選択できます。
select()の戻り値
.data と同じタイプのオブジェクト
準備
あらかじめ、tidyverseパッケージを読み込んでおきます。
library(tidyverse)
解説のために、次のirisとmtcars、anscombeのデータセットを使用します。
iris |>
head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
mtcars |>
head()
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
anscombe |>
head()
x1 x2 x3 x4 y1 y2 y3 y4
1 10 10 10 8 8.04 9.14 7.46 6.58
2 8 8 8 8 6.95 8.14 6.77 5.76
3 13 13 13 8 7.58 8.74 12.74 7.71
4 9 9 9 8 8.81 8.77 7.11 8.84
5 11 11 11 8 8.33 9.26 7.81 8.47
6 14 14 14 8 9.96 8.10 8.84 7.04
列名を使用した方法
列名で指定する場合は、select()の引数に列名を記載します。次のコードで「”(ダブルクォーテーション)」を使用していない(文字列としていない)ことに着目してください。ちなみに、「”」を使用した「select(“mpg”)」としても問題ありません。
mtcars |>
select(mpg) |>
head()
mpg
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Valiant 18.1
列名を複数指定する場合は、select()の引数にカンマ区切りで列名をそのまま記載します。
mtcars |>
select(mpg, cyl) |>
head()
mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
列番号を使用した方法
列番号で指定する場合は、select()の引数に列番号を記載します。
mtcars |>
select(1) |>
head()
mpg
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Valiant 18.1
列番号を複数指定する場合は、select()の引数にカンマ区切りで列番号をそのまま記載します。
mtcars |>
select(1, 2) |>
head()
mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
「:」を使用した方法
「:」と列名を使用して、一続きの列を指定できます。
mtcars |>
select(mpg:wt) |>
head()
mpg cyl disp hp drat wt
Mazda RX4 21.0 6 160 110 3.90 2.620
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875
Datsun 710 22.8 4 108 93 3.85 2.320
Hornet 4 Drive 21.4 6 258 110 3.08 3.215
Hornet Sportabout 18.7 8 360 175 3.15 3.440
Valiant 18.1 6 225 105 2.76 3.460
同様に、「:」と列番号を使用して、一続きの列を指定できます。
mtcars |>
select(1:6) |>
head()
mpg cyl disp hp drat wt
Mazda RX4 21.0 6 160 110 3.90 2.620
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875
Datsun 710 22.8 4 108 93 3.85 2.320
Hornet 4 Drive 21.4 6 258 110 3.08 3.215
Hornet Sportabout 18.7 8 360 175 3.15 3.440
Valiant 18.1 6 225 105 2.76 3.460
「!」を使用した方法
「!」を使用すると、列の補集合で指定できます。次の例では列名を使用して、mpg以外の列名を抽出しています。
mtcars |>
select(!mpg) |>
head()
cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 6 225 105 2.76 3.460 20.22 1 0 3 1
同様に、列番号でも「!」を使用できます。
mtcars |>
select(!1) |>
head()
cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 6 225 105 2.76 3.460 20.22 1 0 3 1
ベクトルを使用した方法
ベクトルを使用して、列を抽出できます。列の選択を動的に実行するためには、ベクトルでの選択をするようにします。
mtcars |>
select(c(mpg, cyl)) |>
head()
mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
mtcars |>
select(c("mpg", "cyl")) |>
head()
mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
mtcars |>
select(c(1, 2)) |>
head()
mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
starts_with()を使用した方法
指定した接頭辞(プレフィックス)で始まる列名を持つデータフレームを抽出できます。
iris |>
select(starts_with("Sepal")) |>
head()
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
starts_with()の使い方
starts_with(match, ignore.case = TRUE, vars = NULL)
starts_with()の引数の意味
文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。
TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。
変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(select()やpivot_longer()のような関数によって設定される)から取得されます。
ends_with()を使用した方法
指定した接尾辞(サフィックス)で終わる列名を持つデータフレームを抽出できます。
iris |>
select(ends_with("Length")) |>
head()
Sepal.Length Petal.Length
1 5.1 1.4
2 4.9 1.4
3 4.7 1.3
4 4.6 1.5
5 5.0 1.4
6 5.4 1.7
ends_with()の使い方
ends_with(match, ignore.case = TRUE, vars = NULL)
ends_with()の引数の意味
文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。
TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。
変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(select()やpivot_longer()のような関数によって設定される)から取得されます。
contains()を使用した方法
ある文字列を含む列名を持つデータフレームを抽出できます。
iris |>
select(contains("l.L")) |>
head()
Sepal.Length Petal.Length
1 5.1 1.4
2 4.9 1.4
3 4.7 1.3
4 4.6 1.5
5 5.0 1.4
6 5.4 1.7
contains()の使い方
contains(match, ignore.case = TRUE, vars = NULL)
contains()の引数の意味
文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。
TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。
変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(select()やpivot_longer()のような関数によって設定される)から取得されます。
matches()を使用した方法
正規表現に該当する列名を持つデータフレームを抽出できます。
iris |>
select(matches("^Sepal|^Species")) |>
head()
Sepal.Length Sepal.Width Species
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
matches()の使い方
matches(match, ignore.case = TRUE, perl = FALSE, vars = NULL)
matches()の引数の意味
文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。
TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。
Perl互換の正規表現を使うかどうかを指定します。
変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(select()やpivot_longer()のような関数によって設定される)から取得されます。
num_range()を使用した方法
列名が連番となっている場合に、列の抽出を容易にします。
anscombe |>
select(num_range("x", 1:3)) |>
head()
x1 x2 x3
1 10 10 10
2 8 8 8
3 13 13 13
4 9 9 9
5 11 11 11
6 14 14 14
num_range()の使い方
num_range(prefix, range, suffix = "", width = NULL, vars = NULL)
num_range()の引数の意味
数値範囲の前後に追加される接尾辞(プレフィックス)を指定します。
1:5のような整数の連番を指定します。
数値範囲の前後に追加される接尾辞(サフィックス)を指定します。
必要に応じて、数値範囲の「幅」を指定します。
例えば、範囲が2の場合は「01」、範囲が3の場合は「001」などになります。
変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(select()やpivot_longer()のような関数によって設定される)から取得されます。
where()を使用した方法
すべての列に関数を適用し、その関数がTRUEを返す列を選択します。次のサンプルコードは列がファクターであるものを抽出しています。
iris |>
select(where(is.factor)) |>
head()
Species
1 setosa
2 setosa
3 setosa
4 setosa
5 setosa
6 setosa
where()を使用すると、次のように数値型かつ最大値が5未満の列、といった複雑な列指定が可能です。
mtcars |>
select(where(~ is.numeric(.) & max(.) < 5)) |>
head()
drat vs am
Mazda RX4 3.90 0 1
Mazda RX4 Wag 3.90 0 1
Datsun 710 3.85 1 1
Hornet 4 Drive 3.08 1 0
Hornet Sportabout 3.15 0 0
Valiant 2.76 1 0
last_col()を使用した方法
列名の最後または最後から指定した番号に戻った列名を持つデータフレームを抽出できます。
iris |>
select(last_col()) |>
head()
Species
1 setosa
2 setosa
3 setosa
4 setosa
5 setosa
6 setosa
last_col()の使い方
last_col(offset = 0L, vars = NULL)
last_col()の引数の意味
これをnに設定すると、端からn番目の変数が選択されます。
変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(select()やpivot_longer()のような関数によって設定される)から取得されます。
all_of()を使用した方法
文字ベクトル内の変数名に一致したデータフレームを抽出できます。すべての名前が存在する必要があり、存在しない場合はエラーがスローされます。
iris |>
select(all_of(c("Sepal.Length", "Sepal.Width"))) |>
head()
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
any_of()を使用した方法
all_of()と同じですが、存在しない名前に対してはエラーがスローされません。
iris |>
select(any_of(c("Sepal.Length", "Sepal.Width"))) |>
head()
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
everything()を使用した方法
everything()は、すべての列を表します。everything()は、select()で使うことはほとんどなく、tidyverseパッケージ内のselect()以外の関数の列指定のときに使うことがあります。