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
まとめ
- tidyverseで1つのデータフレームの列の絞り込みは、dplyrパッケージのselect関数を使う。
- select関数は、様々な指定方法で絞り込みができて、条件を満たす列を絞り込む。
- ヘルパー関数を利用すると、列名と文字列条件のマッチや正規表現を利用した絞り込みが簡単に行える。
- Rの標準的な操作subset関数で、selectオプションに条件を指定すると、同じようにな操作が行える。
論文・データ解析の支援
個別に直接相談できるのが良いと、たくさんの方にご利用頂いています。