tidyverse – select関数でデータフレームの列を絞り込む dplyrパッケージ

tidyverseで1つのデータフレームの列の絞り込みは、dplyrパッケージのselect関数を使います。selectは条件を満たす列を絞り込む関数です。様々な指定方法で絞り込みができます。列名と文字列条件のマッチや正規表現を利用した絞り込みは、ヘルパー関数を利用します。Rの標準的な操作subset関数と同じように使えます。

列の指定方法は以下のような方法があります。

  • 名前を指定(カンマ区切り)
  • 範囲を指定(start列名:end列名)
  • 除外(-列名)
  • 名前を変更して指定(単純に列名変更ではrenameが便利)
  • ヘルパー関数と組み合わせた指定

条件を満たす列を絞り込む

dplyrパッケージのselect関数を使えば、データフレームから条件をみたす列の絞り込みを行うことができます。tidyverseパッケージをロードすると使えるようになります。select関数は、複数の条件を指定でき、全ての条件を満たす列が絞り込まれます。

書式

select関数は、第1引数にデータ、第2引数以降に絞り込みを行う列名や条件を指定できます。パイプ(%>%)を使って連続的に処理を記述する場合は、第1引数のデータは省略することができます。

> select(データ, 条件)

> データ %>% select(条件1)

列名を指定

select関数に複数の列名を指定して2列に絞り込んでいます。絞り込んだ条件は、列名を2つ、カンマ区切りで並べて「Sepal.Length, Sepal.Width」としました。対応する列データだけが抽出されます。

 1: > library(tidyverse)
 2: 
 3: > iris %>% head
 4:   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
 5: 1          5.1         3.5          1.4         0.2  setosa
 6: 2          4.9         3.0          1.4         0.2  setosa
 7: 3          4.7         3.2          1.3         0.2  setosa
 8: 4          4.6         3.1          1.5         0.2  setosa
 9: 5          5.0         3.6          1.4         0.2  setosa
10: 6          5.4         3.9          1.7         0.4  setosa
11: 
12: > iris %>% select(Sepal.Length, Sepal.Width) %>% head
13:   Sepal.Length Sepal.Width
14: 1          5.1         3.5
15: 2          4.9         3.0
16: 3          4.7         3.2
17: 4          4.6         3.1
18: 5          5.0         3.6
19: 6          5.4         3.9

範囲を指定

select関数に列名を範囲で指定して列を絞り込んでいます。絞り込んだ条件は、開始列名〜終了列名で、コロン(:)で並べて「Sepal.Width:Petal.Length」としました。対応する2列目〜3列目データだけが抽出されます。

1: > iris %>% select(Sepal.Width:Petal.Length) %>% head
2:   Sepal.Width Petal.Length
3: 1         3.5          1.4
4: 2         3.0          1.4
5: 3         3.2          1.3
6: 4         3.1          1.5
7: 5         3.6          1.4
8: 6         3.9          1.7

除外

select関数に除外する列名を指定して列を絞り込んでいます。絞り込んだ条件は、除外列名の指定(複数)で、それぞれマイナス(ー)をつけて、カンマ区切りで並べて「-Sepal.Width, -Petal.Length」としました。対応する2列目と3列目が除外されて、残りの列だけが抽出されます。

1: > iris %>% select(-Sepal.Width, -Petal.Length) %>% head
2:   Sepal.Length Petal.Width Species
3: 1          5.1         0.2  setosa
4: 2          4.9         0.2  setosa
5: 3          4.7         0.2  setosa
6: 4          4.6         0.2  setosa
7: 5          5.0         0.2  setosa
8: 6          5.4         0.4  setosa

列名の変更

列を絞り込むときに、列名を変更することができます。selectで列を選びつつ列名を変更する方法と、単純に列名だけ変更する方法gあります。

selectを利用した列名変更

select関数に複数の列名を指定して2列に絞り込んでいます。ただし、その時、列名も変更しています。絞り込んだ条件は、列名を2つ、カンマ区切りで並べましたが、変更後の列名を与えて「”sepal_length” = Sepal.Length, “sepal_width” = Sepal.Width」としました。対応する列だけが指定した列名へ変更されて抽出されます。

1: > iris %>% select("sepal_length" = Sepal.Length, "sepal_width" = Sepal.Width) %>% head
2:   sepal_length sepal_width
3: 1          5.1         3.5
4: 2          4.9         3.0
5: 3          4.7         3.2
6: 4          4.6         3.1
7: 5          5.0         3.6
8: 6          5.4         3.9

単純に列名を変更するrename

rename関数に複数の列名を指定して、列名を変更しています。変更後の列名を与えて「”sepal_length” = Sepal.Length, “sepal_width” = Sepal.Width」としました。rename関数は列名の変更だけを行うので、指定した列の列名が変更されて、データは全体が表示されます。

1: > iris %>% rename("sepal_length" = Sepal.Length, "sepal_width" = Sepal.Width) %>% head
2:   sepal_length sepal_width Petal.Length Petal.Width Species
3: 1          5.1         3.5          1.4         0.2  setosa
4: 2          4.9         3.0          1.4         0.2  setosa
5: 3          4.7         3.2          1.3         0.2  setosa
6: 4          4.6         3.1          1.5         0.2  setosa
7: 5          5.0         3.6          1.4         0.2  setosa
8: 6          5.4         3.9          1.7         0.4  setosa

ヘルパー関数との組み合わせ

select関数による列の絞り込みの条件に、細かい条件を指定したい場合はヘルパー関数を使って指定することができます。ヘルパー関数を使うと、列名とのマッチ条件で絞り込んだり、列名との正規表現で絞り込むことができます。

ヘルパー関数

  • starts_with(), ends_with() 指定した文字列で始まる/終わる
  • contains() 指定した文字列を含む
  • matches() 指定した正規表現にマッチする
  • one_of() 指定した文字列群のどれかにマッチする
  • num_range() compare1・compare2…などの様に連続した列名の抽出

指定した文字列で始まる/終わる 列を選択

select関数にヘルパー関数を指定して列を絞り込んでいます。絞り込んだ条件は、指定した文字で始まる列名「starts_with(“S”)」としました。対応する列データだけが抽出されます。

1: > iris %>% select(starts_with("S")) %>% head
2:   Sepal.Length Sepal.Width Species
3: 1          5.1         3.5  setosa
4: 2          4.9         3.0  setosa
5: 3          4.7         3.2  setosa
6: 4          4.6         3.1  setosa
7: 5          5.0         3.6  setosa
8: 6          5.4         3.9  setosa

指定した文字列を含む列を選択

select関数にヘルパー関数を指定して列を絞り込んでいます。絞り込んだ条件は、指定した文字を含む列名「contains(“th”)」としました。対応する文字列を含む列データだけが抽出されます。

1: > iris %>% select(contains("th")) %>% head
2:   Sepal.Length Sepal.Width Petal.Length Petal.Width
3: 1          5.1         3.5          1.4         0.2
4: 2          4.9         3.0          1.4         0.2
5: 3          4.7         3.2          1.3         0.2
6: 4          4.6         3.1          1.5         0.2
7: 5          5.0         3.6          1.4         0.2
8: 6          5.4         3.9          1.7         0.4

正規表現にマッチする列を選択

select関数にヘルパー関数を指定して正規表現で列を絞り込んでいます。絞り込んだ条件は、V〜Zのいずれかにマッチする列名「matches(“[VWXYZ]”)」としました。指定した正規表現にマッチする列名のデータだけが抽出されます。

1: > iris %>% select(matches("[VWXYZ]")) %>% head
2:   Sepal.Width Petal.Width
3: 1         3.5         0.2
4: 2         3.0         0.2
5: 3         3.2         0.2
6: 4         3.1         0.2
7: 5         3.6         0.2
8: 6         3.9         0.4

列の範囲指定

select関数にヘルパー関数を指定して連番の列を絞り込んでいます。renameで列名を連番に変更し、その後、wid1,wid2,wid3…というような連番になる列名「num_range(“wid”, 1:3)」としました。条件指定したのは「wid1,wid2,wid3」ですが、実際にマッチした「wid1,wid2」だけが抽出されます。

 1: > iris %>% rename(
 2: "len1"=Sepal.Length, 
 3: "wid1"=Sepal.Width, 
 4: "len2"=Petal.Length, 
 5: "wid2"=Petal.Width) %>% 
 6: select(num_range("wid", 1:3)) %>% head
 7:   wid1 wid2
 8: 1  3.5  0.2
 9: 2  3.0  0.2
10: 3  3.2  0.2
11: 4  3.1  0.2
12: 5  3.6  0.2
13: 6  3.9  0.4

指定した文字列のどれか1つにマッチする列を選択

select関数にヘルパー関数を指定して文字列候補に一致する列を絞り込んでいます。絞り込んだ条件は、”species”, “Species”, “spece”のいずれかにマッチする列名「one_of(c(“species”, “Species”, “spece”))」としました。指定した文字列にマッチする列名のデータだけが抽出されます。尚、指定した文字列に複数ヒットすれば、それぞれに対応した列が抽出されます。表示する列の順番も指定した文字列に対応した順番になります。

 1: > iris %>% select(one_of(c("species", "Species", "spece"))) %>% head
 2:   Species
 3: 1  setosa
 4: 2  setosa
 5: 3  setosa
 6: 4  setosa
 7: 5  setosa
 8: 6  setosa
 9: Warning message:
10: Unknown columns: `species`, `spece`

Rの標準的な操作

データフレームに対して列の絞り込みを行う場合、Rの標準的な方法ではsubset関数を使います。第1引数にデータ、第2引数に絞り込みの条件を与えます。列の絞り込みの条件は、subset(select=条件)として指定します。

subset 列番号で絞り込み

1: > iris %>% subset(select=c(1,2)) %>% head
2:   Sepal.Length Sepal.Width
3: 1          5.1         3.5
4: 2          4.9         3.0
5: 3          4.7         3.2
6: 4          4.6         3.1
7: 5          5.0         3.6
8: 6          5.4         3.9

subset 列範囲で絞り込み

1: > iris %>% subset(select=c(1:2)) %>% head
2:   Sepal.Length Sepal.Width
3: 1          5.1         3.5
4: 2          4.9         3.0
5: 3          4.7         3.2
6: 4          4.6         3.1
7: 5          5.0         3.6
8: 6          5.4         3.9

subset 列名で絞り込み

1: > iris %>% subset(select=c(Sepal.Length, Sepal.Width)) %>% head
2:   Sepal.Length Sepal.Width
3: 1          5.1         3.5
4: 2          4.9         3.0
5: 3          4.7         3.2
6: 4          4.6         3.1
7: 5          5.0         3.6
8: 6          5.4         3.9

subset 除外列名で絞り込み

1: > iris %>% subset(select=c(-Sepal.Length, -Sepal.Width)) %>% head
2:   Petal.Length Petal.Width Species
3: 1          1.4         0.2  setosa
4: 2          1.4         0.2  setosa
5: 3          1.3         0.2  setosa
6: 4          1.5         0.2  setosa
7: 5          1.4         0.2  setosa
8: 6          1.7         0.4  setosa

subset 正規表現を利用して絞り込み(結局は列名での抽出と同じ)

1: > iris %>% subset(select=grep("^S", colnames(iris))) %>% head
2:   Sepal.Length Sepal.Width Species
3: 1          5.1         3.5  setosa
4: 2          4.9         3.0  setosa
5: 3          4.7         3.2  setosa
6: 4          4.6         3.1  setosa
7: 5          5.0         3.6  setosa
8: 6          5.4         3.9  setosa

【関連】R subset関数 データフレームやmatrixからの条件指定による行・列の抽出

まとめ

  • tidyverseで1つのデータフレームの列の絞り込みは、dplyrパッケージのselect関数を使う。
  • select関数は、様々な指定方法で絞り込みができて、条件を満たす列を絞り込む。
  • ヘルパー関数を利用すると、列名と文字列条件のマッチや正規表現を利用した絞り込みが簡単に行える。
  • Rの標準的な操作subset関数で、selectオプションに条件を指定すると、同じようにな操作が行える。



ピックアップ記事

  1. awk for 繰り返し処理 簡単なサンプルでわかる インクリメント・デクリメント、変わった繰り返し

    awkのfor文は、カウンタを目印にして処理を繰り返したいときによく使われます。for文では、カウ…
  2. R 使い方 グラフの色 自作のカラーパレットとデフォルトのカラーパレット

    グラフを描画する際、色の組み合わせを1つ1つ考えるのは面倒ですよね。Rには、あらかじめ色の組み合わ…
  3. awk split サンプルでわかる列の分割とセパレータ(文字・正規表現)の指定方法

    awkのsplit関数は、セパレータを指定して文字列を分割することができます。セパレータには文字や…

人気記事

  1. R データ型 - 文字列・ベクター・データフレーム・マトリックス など-, R言語, スクリプト

    R subset関数 データフレームやmatrixからの条件指定による行・列の抽出
    R の subset関数は、データフレームやマトリックスか…
  2. Excel, その他, 統計

    z-score 計算方法 エクセル(Excel) 編
    統計処理で、大きく変化しているなどの判断基準にも使われる値…
  3. IGV, 解析ツール

    IGV 使い方 インストール〜便利な使い方まで | リファレンス・マッピングデータ・アノテーションを読み込んで表示しよう
    IGV(Integrative Genomics View…

おすすめ記事

  1. R言語, グラフ

    R 使い方 軸・ラベルの調整(向き・サイズ・色など) グラフの描き方
    Rによるplot(グラフ)の描画は、手軽で大変便利です。た…
  2. bash 応用, シェルスクリプト

    シェル スクリプト ファイル存在チェック・空のファイルチェック
    bashでスクリプトを作成するときに、よく使うのがファイル…
  3. awk, bash 文字列操作, シェルスクリプト

    bash 部分文字列・置換・長さ・連結・分割の文字列処理
    bashのよく使う文字列処理、部分文字列・置換・連結・長さ…