R言語でデータフレームから指定した列を持つデータフレームを取得する方法について解説します。このような方法はいくつかあり、R言語に標準で搭載されている機能を使用した方法もありますが、ここではtidyverseパッケージに含まれているdplyrパッケージのselect()を使用した方法についてお伝えします。
また、select()を使用した列を指定する方法は、tidyverseパッケージ内のselect()以外の関数で列を指定する方法としても利用できます。

select()の概要

select()は、名前とタイプを使用して列を保持または削除する関数です。これは、名前(例: a:fは左のaから右のfまでのすべての列を選択)またはタイプ(例: where(is.numeric)はすべての数値列を選択)に基づいて変数を簡単に参照できる簡潔なミニ言語を使用して、データフレーム内の列を選択(およびオプションで名前を変更)します。

select()の使い方

まずは、dplyr::select()の使い方について確認しておきます。


select(.data, ...)

select()の引数の意味

.data

データフレームまたはデータフレーム拡張(例: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()の引数の意味

match

文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。

ignore.case = TRUE

TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。

vars = NULL

変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(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()の引数の意味

match

文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。

ignore.case = TRUE

TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。

vars = NULL

変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(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()の引数の意味

match

文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。

ignore.case = TRUE

TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。

vars = NULL

変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(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()の引数の意味

match

文字ベクトルを指定します。
長さ>1の場合、一致の和集合が取られます。

ignore.case = TRUE

TRUEの場合(既定値)では、名前の一致時に大文字と小文字が無視されます。

perl = FALSE

Perl互換の正規表現を使うかどうかを指定します。

vars = NULL

変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(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()の引数の意味

prefix

数値範囲の前後に追加される接尾辞(プレフィックス)を指定します。

range

1:5のような整数の連番を指定します。

width = NULL

数値範囲の前後に追加される接尾辞(サフィックス)を指定します。

suffix = “”

必要に応じて、数値範囲の「幅」を指定します。
例えば、範囲が2の場合は「01」、範囲が3の場合は「001」などになります。

vars = NULL

変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(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()の引数の意味

offset = 0L

これをnに設定すると、端からn番目の変数が選択されます。

vars = NULL

変数名の文字ベクトルを指定します。
指定されていない場合、変数は現在の選択コンテキスト(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()以外の関数の列指定のときに使うことがあります。

R入門 データフレームから指定した列を持つデータフレームの取得