R の select 関数: データフレームの列を選択する

UBC/informatics/r/select

このページの最終更新日: 2023/12/31

  1. 概要: select() 関数とは
  2. 列番号 or 列名指定で抽出
  3. 列番号 or 列名指定で削除
  4. 前方一致、後方一致、部分一致で抽出・削除
  5. ベクターで抽出する列を指定

応用 (別ページ)


広告

概要: select() 関数とは

select() 関数とは、データフレームから列を抽出する R の関数である。dplyr というパッケージに含まれており、R のデフォルト関数ではないので、インストールされていないならまず install.packages でインストールし、読み込んでから使う。

dplyr は tidyverse というパッケージに含まれている。こちらを使う tidyverse は dplyr 以外にも便利な関数を含んでいるので、こちらを使うことが多いだろう。詳細は tidyverse パッケージ のページへ。

install.packages('dplyr') # 初回のみ
library(dplyr)

このページでは、select() 関数の基本的な使い方をまとめる。以下のようなページと関連が深い。

select() 関数とよく一緒に使われる関数を表にしておく。主に文字列指定のときに使う。

starts_with 前方一致
ends_with 後方一致
contains 部分一致
all_of ベクターで列を指定する ときに使用
any_of ベクターで指定

列番号 or 列名指定で抽出

.data でデータフレームを指定し、その後に列番号を書く。syntax が直感的で覚えやすいのがいい。以下で、dataframe から 1 列目と 3 列目が抽出され、A というオブジェクトに格納される。

A = select(.data = dataframe, 1,3)

.data は省略可能。

A <- select(dataframe, 1,3)

演算子 %>% を使うとこうなる。

A <- dataframe %>% select(1,3)

新しいデータフレームにおける列名を決めながら抽出することもできる。

A = select(dataframe, 新列名1 = dataframeの列名1, 新列名2 = dataframeの列名2)

列番号 or 列名指定で削除

既存のデータフレームから列を除くときは、マイナス記号を使える。複数の列を一気に除きたいときは、c でくくる。

前方一致、後方一致、部分一致で抽出・削除

列の名前の一部を使っても抽出、削除が可能。関数の名前も、starts_with、ends_with、contains と直感的にわかりやすい。

A = select(.data = A, starts_with("文字列"))
A = select(.data = A, ends_with("文字列"))
A = select(.data = A, contains("文字列"))

大文字・小文字を区別するかどうかの設定も可能。starts_with、ends_with、contains の 3 つとも同じように指定できる。

A = select(.data = A, starts_with("文字列", ignore.case = TRUE))

ベクターで抽出する列を指定

組み込みデータセット の mtcars を使ってみる。このデータは、以下のように車の種類が行に、mpg (マイル/ガロン、燃費の指標)、hp (馬力 horse power) などが列になっている。

Rの組み込みデータセット mtcars

最初の 3 行、mpg, cyl, disp を選びたいときは、上で見たように c() で囲って複数指定する。

A <- mtcars %>% select(c("mpg", "cyl", "disp"))

これは、c() の部分をベクターに格納して以下のように書いても同じに思える。

vec <- c("mpg", "cyl", "disp")
A <- mtcars %>% select(vec)

これで実際に動くときは動くのだが、以下のような警告が出る。


all_of の使用

これは、select() の中で vec というベクターを指定したいときは、単に vec と書くのではなく、all_of(vec) を使えということである。

all_of を使わないと、mtcars に vec という列があったら、そっちが抽出されてしまう という問題があるためらしい。

any_of の使用

all_of(vec) の代わりに、any_of を使うこともできる。

all_of と any_of の違いは、all_of だと、ベクターの全ての要素が合致しないとエラーになる ということ。たとえば、mecars にない列 color を含むベクターを使う場合。

「color という列はないので、抽出できない」というエラーに。


ところが、any_of にすると存在しないカラムは無視し、存在する "mpg", "cyl", "disp" が抽出される。個人的には、エラーで止まってくれる all_of の方が、ミスを見逃すことがなく使いやすいように思う。



広告

References

  1. 列の選択 - select関数. Link: Last access 2022/05/24.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。