library(tidyverse)それでは、select関数を実際に使っていきましょう。
dat <- tibble(a=1,b=1,c=1,d=1,e=1,f=1,g=1)
dat# A tibble: 1 × 7
a b c d e f g
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1
練習のために、まずは簡単な例から確認していきます。
基本的なselectでの選択は、
dat %>% select(a)# A tibble: 1 × 1
a
<dbl>
1 1
で1列だけを選択する他、
dat %>% select(a,c,f)# A tibble: 1 × 3
a c f
<dbl> <dbl> <dbl>
1 1 1 1
の様に、複数列を選択することも可能でした。
!を使うことで、除外選択も可能で、
dat %>% select(!a)# A tibble: 1 × 6
b c d e f g
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1
で、a列だけを除外することもできます。
複数列を同時に除外したい場合は、
dat %>% select(!c(a,c,d,g))# A tibble: 1 × 3
b e f
<dbl> <dbl> <dbl>
1 1 1 1
のように、c()でくくってあげて、その対象全体を!で除外するというような書き方になります
everything():
everything()は全部選択できました。この関数、単独でつかうと
dat %>% select(everything())# A tibble: 1 × 7
a b c d e f g
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1
まったく同じ結果になるので、あんまり存在意義を感じないかもしれませんが、列を並び替えたい時に便利です。例えば、今、aからgまでの順番で列が並んでいますが、これをg,a,b,c,d,e,fという順番で並び替えたいときに、
dat %>% select(g,a,b,c,d,e,f)# A tibble: 1 × 7
g a b c d e f
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1
と書くのではなく、
dat %>% select(g, everything())# A tibble: 1 × 7
g a b c d e f
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1
と描くことで目的達成です。今の例だと、列名自体は短いのでそれほど手間ではないかもしれませんが、everythingが該当する列名が、id, gender, age, school, income, health_status,q1, q2, …..というようなアンケートデータであったり、列数が100個あるとかの場合は、それをいちいち書くことなく、並び替えることができます。
everything,matches,starts_with, ends_withはselection helperと呼ばれる関数群です。
dat <- tibble(
qA1=1,
qA2=1,
qA3=1,
qA4a1=1,
qA4a2=1,
qA4b1=1,
qA4b2=1,
qA1_supp = 1,
qA2_supp = 1,
qB1=1,
qB2=1,
qB3=1,
qB4a1=1,
qB4a2=1,
qB4b1=1,
qB4b2=1,
qB1_supp = 1,
qB2_supp = 2
)
dat# A tibble: 1 × 18
qA1 qA2 qA3 qA4a1 qA4a2 qA4b1 qA4b2 qA1_supp qA2_supp qB1 qB2 qB3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1 1 1 1 1 1
# ℹ 6 more variables: qB4a1 <dbl>, qB4a2 <dbl>, qB4b1 <dbl>, qB4b2 <dbl>,
# qB1_supp <dbl>, qB2_supp <dbl>
仮に、こんな列名を持つアンケートデータがあったとしましょう。
データからqAで始まる列だけを取り出したい場合、
dat %>% select(starts_with("qa"))# A tibble: 1 × 9
qA1 qA2 qA3 qA4a1 qA4a2 qA4b1 qA4b2 qA1_supp qA2_supp
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1 1 1
とこんな感じで、まとめて取り出すことが可能です。
他にも、
dat %>% select(starts_with("qA4"))# A tibble: 1 × 4
qA4a1 qA4a2 qA4b1 qA4b2
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
dat %>% select(starts_with("qB4"))# A tibble: 1 × 4
qB4a1 qB4a2 qB4b1 qB4b2
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
こんなことができます。基本的には大文字、小文字の区別はしてくれません。後ほど解説するLogical型というものを勉強した後でHelpファイルを見ていただくと、区別する方法がわかりますので、興味があれば見てみてください。
ends_withを使うと、
dat %>% select(ends_with("_supp"))# A tibble: 1 × 4
qA1_supp qA2_supp qB1_supp qB2_supp
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 2
と、このように末尾の文字列に対してまとめてselectができるので便利です。
このまとめて、選択できる関数、!c()と同じように、
dat %>% select(!ends_with("_supp"))# A tibble: 1 × 14
qA1 qA2 qA3 qA4a1 qA4a2 qA4b1 qA4b2 qB1 qB2 qB3 qB4a1 qB4a2 qB4b1
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1 1 1 1 1 1 1
# ℹ 1 more variable: qB4b2 <dbl>
まとめて除外するようなことも可能です。
部分一致で選択をしたい場合は、
dat %>% select(matches("A1"))# A tibble: 1 × 4
qA1 qA4a1 qA1_supp qB4a1
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
とすると選択できました。
selection helper、若干ややこしいかもしれないので、最初のうちは迷いそうであれば、地道に打ち出すでもよいと思います(私も、selection helperをそれなりに使うようになったの、学びはじめてだいぶたってからでした。最初から知ってたら結構楽できる場面も多いので、ちょっと難しいですがここで取り上げた次第です。)
dat %>% select(matches("A1"))# A tibble: 1 × 4
qA1 qA4a1 qA1_supp qB4a1
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
dat %>% select(qA1, qA4a1, qA1_supp, qB4a1)# A tibble: 1 × 4
qA1 qA4a1 qA1_supp qB4a1
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
最後に、実はrename関数と同じ書き方をすることで選択しながら、列名を変更することも可能ですのでお示ししておきましょう
dat %>% select(question_A1 = qA1,
question_A4a1 = qA4a1)# A tibble: 1 × 2
question_A1 question_A4a1
<dbl> <dbl>
1 1 1
おつかれさまでした! 次の動画でselectの練習問題を解いておきましょう。