2 列(変数)を選ぶ:select

  • 本章のポイント
    • パッケージdplyrの関数select()
    • tidyな世界では「列 = 変数」
    • 変数が多い時に関心ある変数に限定したデータにしたい
    • 関心ある変数の名前を取得したい
    • 後々出てくる繰り返し作業で便利なヘルパー関数について知る

2.1 使用データ

  • データの指定を簡単にするために,penguinsデータをdfと読み込む
  • 読み込みの様々な方法については多くの説明が必要になるので,拙書『Rで読むExcelファイル』参照
df <- 
  palmerpenguins::penguins

# データの表示  
df 
## # A tibble: 344 × 8
##   species island   bill_length_mm bill_depth_mm flipper_length_mm
##   <fct>   <fct>             <dbl>         <dbl>             <int>
## 1 Adelie  Torgers…           39.1          18.7               181
## 2 Adelie  Torgers…           39.5          17.4               186
## 3 Adelie  Torgers…           40.3          18                 195
## # ℹ 341 more rows
## # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int>

2.2 基本

  • 表示させたい変数名(列名)をselect()の中に「,」をつけて並べる
    • 変数は1つからOK
  • |>についてはすでに1.7で説明したが,この後また補足を説明するのでまずは何も考えずに使ってみよう
  • 以降すべてtidyverseパッケージを読み込んだ前提で進める(1.3参照)
library(tidyverse)

df |> 
  select(bill_length_mm, bill_depth_mm)
## # A tibble: 344 × 2
##   bill_length_mm bill_depth_mm
##            <dbl>         <dbl>
## 1           39.1          18.7
## 2           39.5          17.4
## 3           40.3          18  
## # ℹ 341 more rows
  • 新しいデータフレームを作りたい場合は<-を使って新しいオブジェクトに格納する
df2 <- 
  df |> select(bill_length_mm)

df2
## # A tibble: 344 × 1
##   bill_length_mm
##            <dbl>
## 1           39.1
## 2           39.5
## 3           40.3
## # ℹ 341 more rows
# 一時的に見せただけなので削除
rm(df2)

2.2.1 【補足】|> の意味

  • 1.7で説明したパイプ演算子の実例を解説する
  • 基本的にselect()を始めとしたモダンなRの処理は,以下のように第一引数にデータフレームを指定する
select(df, bill_length_mm)
## # A tibble: 344 × 1
##   bill_length_mm
##            <dbl>
## 1           39.1
## 2           39.5
## 3           40.3
## # ℹ 341 more rows
  • |>の役割は,その左側にあるものを右側の関数の第一引数に入れる,ということなので,第一引数にデータフレームが来ることが決まっていれば,常に次のようにかける
df |> 
  select(bill_length_mm)
## # A tibble: 344 × 1
##   bill_length_mm
##            <dbl>
## 1           39.1
## 2           39.5
## 3           40.3
## # ℹ 341 more rows
  • 重要な点として,このコードの処理の結果もデータフレームとなるので,さらに|>でつなげていくことができる
df |> 
  select(bill_length_mm) |> 
  names()
## [1] "bill_length_mm"
  • このようにすると複雑な処理を重ねていく場合も,コードの可読性が高まるので,コードを共有してチーム作業するデータ加工の過程で有用

2.2.2 範囲指定

  • 表示させたい変数がデータフレーム上に順番に並んでいれば,その並びの最初の列名と最後の変数名を:(コロン)でつなげて取得できる
    • 変数の連番をまとめて指定する時などに便利(例 設問1:設問100
df |> 
  select(bill_length_mm:flipper_length_mm)
## # A tibble: 344 × 3
##   bill_length_mm bill_depth_mm flipper_length_mm
##            <dbl>         <dbl>             <int>
## 1           39.1          18.7               181
## 2           39.5          17.4               186
## 3           40.3          18                 195
## # ℹ 341 more rows
  • 範囲に加えて追加の変数も「,」でつないで含めることができる
    • 飛び飛びの変数群を選びたいときに有用
df |> 
  select(bill_length_mm:flipper_length_mm, sex)
## # A tibble: 344 × 4
##   bill_length_mm bill_depth_mm flipper_length_mm sex   
##            <dbl>         <dbl>             <int> <fct> 
## 1           39.1          18.7               181 male  
## 2           39.5          17.4               186 female
## 3           40.3          18                 195 female
## # ℹ 341 more rows

2.2.3 中身が文字でも動く

  • 変数名が" "で囲われていると,Rでは文字(character)だと認識される
  • select()は文字の変数名を与えても動く
df |> 
  select("bill_length_mm", "bill_depth_mm")
## # A tibble: 344 × 2
##   bill_length_mm bill_depth_mm
##            <dbl>         <dbl>
## 1           39.1          18.7
## 2           39.5          17.4
## 3           40.3          18  
## # ℹ 341 more rows
  • これは効率化を図りたいときに重要な特徴
  • select()の中にたくさんの変数名を並べるより,事前に指定しておきベクトルとして代入した方が読みやすい
    • あらかじめ作成したベクトルとして代入するときは,all_of()で囲む必要がある
    • 様々なコード例でこの事前指定が多用されるので慣れるとよい
# あらかじめオブジェクト(ここではvars)に変数名の文字列を格納して後で使えるようにする
vars <- c("bill_length_mm", "bill_depth_mm")

df |> 
  select(all_of(vars))
## # A tibble: 344 × 2
##   bill_length_mm bill_depth_mm
##            <dbl>         <dbl>
## 1           39.1          18.7
## 2           39.5          17.4
## 3           40.3          18  
## # ℹ 341 more rows
  • ここでvarsは文字ベクトル(vector)のオブジェクトとなっている(文字じゃないとエラーになるため)
  • all_of()の中に文字ベクトルを指定することで,それぞれの中身を変数名として認識する
    • 以前使われていたone_ofは現在は非推奨

2.2.4 [練習問題]

  • dfデータで変数speciesからbill_length_mmまでの並び,およびyearの計4列にしてデータフレームを表示させよう

  • dfデータで変数bill_length_mmからbody_mass_gまでの並びの計4列を文字ベクトルにしたうえでselectで選んでデータフレームを表示させよう(冗長な作業に見えるがこの考え方が役に立つ時がくるはず)

2.3 変数の指定に便利なヘルパー関数

  • selection helperと呼ばれるtidyselectパッケージの関数群
  • select()の所で解説されることが多いが,5.3.2で出てくるacross()と併せた活用場面が多いため,なじんでおくと後から楽になる

2.3.1 変数名の最初の文字列

  • billから始まる変数を選ぶ
df |>
  select(starts_with("bill"))
## # A tibble: 344 × 2
##   bill_length_mm bill_depth_mm
##            <dbl>         <dbl>
## 1           39.1          18.7
## 2           39.5          17.4
## 3           40.3          18  
## # ℹ 341 more rows

2.3.2 変数名の最後の文字列

  • _mmで終わる変数を選ぶ
    • mmだけだと他にも含まれる場合が出てくるので,「_」も含めた方が安全
df |>
  select(ends_with("_mm"))
## # A tibble: 344 × 3
##   bill_length_mm bill_depth_mm flipper_length_mm
##            <dbl>         <dbl>             <int>
## 1           39.1          18.7               181
## 2           39.5          17.4               186
## 3           40.3          18                 195
## # ℹ 341 more rows

2.3.3 変数名のどこかに含まれる文字列

2.3.3.1 固定した文字列

  • 指定した文字列を含んだ変数名を対象とする
df |>
  select(contains("length"))
## # A tibble: 344 × 2
##   bill_length_mm flipper_length_mm
##            <dbl>             <int>
## 1           39.1               181
## 2           39.5               186
## 3           40.3               195
## # ℹ 341 more rows

2.3.3.2 柔軟な文字列

  • 文字列で 正規表現 が使えるため柔軟な指定が可能
  • ここでは,“length”または”depth”を含む変数名を対象
    • |が「または」を意味する
df |>
  select(matches("length|depth"))
## # A tibble: 344 × 3
##   bill_length_mm bill_depth_mm flipper_length_mm
##            <dbl>         <dbl>             <int>
## 1           39.1          18.7               181
## 2           39.5          17.4               186
## 3           40.3          18                 195
## # ℹ 341 more rows

2.3.4 上記の組み合わせ

2.3.4.1 かつ

  • それぞれの条件を両方満たす
df |>
  select(starts_with("bill") & contains("length"))
## # A tibble: 344 × 1
##   bill_length_mm
##            <dbl>
## 1           39.1
## 2           39.5
## 3           40.3
## # ℹ 341 more rows

2.3.4.2 または

  • それぞれの条件をいずれか満たす
df |>
  select(starts_with("bill") | contains("length"))
## # A tibble: 344 × 3
##   bill_length_mm bill_depth_mm flipper_length_mm
##            <dbl>         <dbl>             <int>
## 1           39.1          18.7               181
## 2           39.5          17.4               186
## 3           40.3          18                 195
## # ℹ 341 more rows

2.3.5 [練習問題]

  • dfデータで”s”で終わる変数を選んでデータフレームを表示させよう

2.4 特定の変数を選ばない(落とす)

  • 変数名の前に!をつける
df |> 
  select(!species)
## # A tibble: 344 × 7
##   island    bill_length_mm bill_depth_mm flipper_length_mm
##   <fct>              <dbl>         <dbl>             <int>
## 1 Torgersen           39.1          18.7               181
## 2 Torgersen           39.5          17.4               186
## 3 Torgersen           40.3          18                 195
## # ℹ 341 more rows
## # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int>
  • 複数列を落としたい場合は,!c()の中に対象の列名を含める
df |> 
  select(!c(bill_length_mm:flipper_length_mm, sex))
## # A tibble: 344 × 4
##   species island    body_mass_g  year
##   <fct>   <fct>           <int> <int>
## 1 Adelie  Torgersen        3750  2007
## 2 Adelie  Torgersen        3800  2007
## 3 Adelie  Torgersen        3250  2007
## # ℹ 341 more rows
  • ヘルパー関数に対しても使える
df |> 
  select(!ends_with("_mm"))
## # A tibble: 344 × 5
##   species island    body_mass_g sex     year
##   <fct>   <fct>           <int> <fct>  <int>
## 1 Adelie  Torgersen        3750 male    2007
## 2 Adelie  Torgersen        3800 female  2007
## 3 Adelie  Torgersen        3250 female  2007
## # ℹ 341 more rows

2.4.1 [練習問題]

  • dfデータで”length”または”depth”を含む変数以外を選んでデータフレームを表示させよう

2.5 関心のある変数名を取得する

  • データ分析の段階では,関心のある変数名を選択して,それらを代入する作業が頻出
  • 変数名手打ちだと時間もかかるしミスもあるので,効率化のために必ずおさえておきたい技術

2.5.1 全ての変数名

  • データフレームの列名(変数名)を表示させたいときはnames()を使う(またはcolnames()
df |> names()
## [1] "species"           "island"            "bill_length_mm"   
## [4] "bill_depth_mm"     "flipper_length_mm" "body_mass_g"      
## [7] "sex"               "year"

2.5.2 選択した変数名を取得

  • ベクトルとしてオブジェクトに格納
bill_vars <- 
  df |> 
  select(starts_with("bill")) |> 
  names()

bill_vars
## [1] "bill_length_mm" "bill_depth_mm"

2.5.3 コピペに便利な形式に出力

  • ,」で区切られた形式で出てくれば必要なものを選んでそのままselect()に入れられるのに…と思った方のための便利関数dput()
df |> 
  select(starts_with("b")) |> # bから始まる変数名
  names() |> 
  dput()
## c("bill_length_mm", "bill_depth_mm", "body_mass_g")
  • ベクトルの形としてそのまま出てくるので出力から必要な変数を選んでコピペができる
    • names()で出てくるのと違い,「,」がついているのが地味にうれしい
  • " "すらもいらない,という時は,新しくr scriptを開いて,dput()の出力を貼り付けてすべて置換する力技も