94  selectの実践

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の練習問題を解いておきましょう。