3 列(変数)名を変更する:rename

  • 本章のポイント
    • パッケージdplyrの関数rename()
    • tidyな世界では「列名 = 変数名」
    • 分かりやすい列名にすることだけでなく,本書の範囲を超えるが複数データの連結や同時処理関連で重要な役割を果たす
    • 文字を扱うためのパッケージstringrの便利さを学ぶ

3.1 基本

  • まずはデータにどういう変数名があるかの確認
  • 使用データは2.1で読み込んだdfを使用
df |> names()
## [1] "species"           "island"            "bill_length_mm"   
## [4] "bill_depth_mm"     "flipper_length_mm" "body_mass_g"      
## [7] "sex"               "year"
  • 変更したい変数名を new = old の順に入力する
  • 例:bill_length_mmをblmmに変更してみる
# まだtidyverseパッケージを読み込んでない場合は以下の#を外して実行
# library(tidyverse)

df |> 
  rename(blmm = bill_length_mm)
## # A tibble: 344 × 8
##   species island     blmm bill_depth_mm flipper_length_mm
##   <fct>   <fct>     <dbl>         <dbl>             <int>
## 1 Adelie  Torgersen  39.1          18.7               181
## 2 Adelie  Torgersen  39.5          17.4               186
## 3 Adelie  Torgersen  40.3          18                 195
## # ℹ 341 more rows
## # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int>
  • 複数の変数名を変更する場合は,rename()の中に「,」でつなげていく
    • でもたくさんある場合に一つ一つ書いていくのは大変
df |> 
  rename(blmm = bill_length_mm,
         bdmm = bill_depth_mm)
## # A tibble: 344 × 8
##   species island   blmm  bdmm flipper_length_mm body_mass_g sex  
##   <fct>   <fct>   <dbl> <dbl>             <int>       <int> <fct>
## 1 Adelie  Torger…  39.1  18.7               181        3750 male 
## 2 Adelie  Torger…  39.5  17.4               186        3800 fema…
## 3 Adelie  Torger…  40.3  18                 195        3250 fema…
## # ℹ 341 more rows
## # ℹ 1 more variable: year <int>
  • 複数変数を扱うときはrename_with()が便利。以下はそれを用いた例を示していく

3.2 同じ語を共通の語で置き換える

  • 変数名の”bill”の部分を日本語の”くちばし”に変更していく
  • まずは基本の知識でできる方法
df |> 
  rename(くちばし_length_mm = bill_length_mm,
         くちばし_depth_mm = bill_depth_mm)
## # A tibble: 344 × 8
##   species island    くちばし_length_mm くちばし_depth_mm
##   <fct>   <fct>                  <dbl>             <dbl>
## 1 Adelie  Torgersen               39.1              18.7
## 2 Adelie  Torgersen               39.5              17.4
## 3 Adelie  Torgersen               40.3              18  
## # ℹ 341 more rows
## # ℹ 4 more variables: flipper_length_mm <int>,
## #   body_mass_g <int>, sex <fct>, year <int>

3.2.1 【効率化】str_replace()で一括変換(1)

  • rename_with()は,まず適用したい関数を示し,そのあとに該当する列を選ぶ
    • 該当する変数を選ぶ部分は,デフォルトで全ての列に対して適用(everything())となっているので,全ての列に適用したい場合は省略してもよい
  • 語の置き換えにstringr::str_replace()を適用してみたい
    • 第一引数に対して,その次の文字列をその後の文字列に置換する(ここでは”bill” → “くちばし”)
  • 第一引数の「x」の部分に,その後選ぶ列が入っていく(ここではstarts_with("bill")
    • この部分の理解は今すぐできなくてもよいが,学習を進めるためにキーワードだけ示しておくと,無名関数(anonymous function)という処理をしている(1.4.2.2参照)
df |> 
  rename_with(\(x) str_replace(x, "bill", "くちばし"),
              starts_with("bill"))
## # A tibble: 344 × 8
##   species island    くちばし_length_mm くちばし_depth_mm
##   <fct>   <fct>                  <dbl>             <dbl>
## 1 Adelie  Torgersen               39.1              18.7
## 2 Adelie  Torgersen               39.5              17.4
## 3 Adelie  Torgersen               40.3              18  
## # ℹ 341 more rows
## # ℹ 4 more variables: flipper_length_mm <int>,
## #   body_mass_g <int>, sex <fct>, year <int>
  • (参考)purrr 1.0.0より前のバージョンでの説明
    • 第一引数の「.x」の部分に,その後選ぶ変数が入っていく(なおこのような単純な場合はxを省略した「.」だけでも動く)
    • この場合適用したい関数の前には~(チルダ)が必ずつく
# purrr 1.0.0より前のバージョンでの書き方
# df |> 
#   rename_with(~str_replace(.x, "bill", "くちばし"),
#               starts_with("bill"))
  • デフォルトで全ての列が対象になっているので,実はstarts_with("bill")がなくても動く
df |> 
  rename_with(\(x) str_replace(x, "bill", "くちばし"))
## # A tibble: 344 × 8
##   species island    くちばし_length_mm くちばし_depth_mm
##   <fct>   <fct>                  <dbl>             <dbl>
## 1 Adelie  Torgersen               39.1              18.7
## 2 Adelie  Torgersen               39.5              17.4
## 3 Adelie  Torgersen               40.3              18  
## # ℹ 341 more rows
## # ℹ 4 more variables: flipper_length_mm <int>,
## #   body_mass_g <int>, sex <fct>, year <int>

3.2.1.1 【別解】

  • select()の時のように単にc()の中に変数を指定していくだけでも動く
df |> 
  rename_with(\(x) str_replace(x, "bill", "くちばし"),
              c(bill_length_mm, bill_depth_mm))
## # A tibble: 344 × 8
##   species island    くちばし_length_mm くちばし_depth_mm
##   <fct>   <fct>                  <dbl>             <dbl>
## 1 Adelie  Torgersen               39.1              18.7
## 2 Adelie  Torgersen               39.5              17.4
## 3 Adelie  Torgersen               40.3              18  
## # ℹ 341 more rows
## # ℹ 4 more variables: flipper_length_mm <int>,
## #   body_mass_g <int>, sex <fct>, year <int>

3.2.2 [練習問題]

  • dfデータで”_mm”で終わる変数の名前の”_mm”部分を”_ミリ”に一括で変換しよう

3.3 同じ語を削除する

  • “_mm”を取り除きたい場合,それを削除した変数名を指定すればよいが,たくさんあると大変
df |> 
  rename(bill_length = bill_length_mm,
         bill_depth  = bill_depth_mm,
         flipper_length = flipper_length_mm)
## # A tibble: 344 × 8
##   species island    bill_length bill_depth flipper_length
##   <fct>   <fct>           <dbl>      <dbl>          <int>
## 1 Adelie  Torgersen        39.1       18.7            181
## 2 Adelie  Torgersen        39.5       17.4            186
## 3 Adelie  Torgersen        40.3       18              195
## # ℹ 341 more rows
## # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int>

3.3.1 【効率化】str_replace()で一括変換(2)

  • str_replace()で変換先に空白「" "」を指定すると削除できる
df |> 
  rename_with(\(x) str_replace(x, "_mm", " "),
              ends_with("mm"))
## # A tibble: 344 × 8
##   species island   `bill_length ` `bill_depth ` `flipper_length `
##   <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>

3.3.1.1 【別解】

  • stringr::str_remove()の方が直接的
    • 第一引数についてその次に来る文字列を取り除く
df |> 
  rename_with(\(x) str_remove(x, "_mm"),
              ends_with("mm"))
## # A tibble: 344 × 8
##   species island    bill_length bill_depth flipper_length
##   <fct>   <fct>           <dbl>      <dbl>          <int>
## 1 Adelie  Torgersen        39.1       18.7            181
## 2 Adelie  Torgersen        39.5       17.4            186
## 3 Adelie  Torgersen        40.3       18              195
## # ℹ 341 more rows
## # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int>

3.3.2 [練習問題]

  • dfデータで”_“を含む変数の名前から,”_“をすべて取り除こう(ヒント5

3.4 同じ接尾辞をつける

  • 変数yearで2007年のみのデータに限定し,くちばし(bill)と翼(flipper)の変数名の末に接尾辞”_2007”をつける
  • rename()の中に全部書いていけばできるが数が多いと大変
df |> 
  filter(year == 2007) |> 
  select(bill_length_mm:flipper_length_mm, year) |> 
  rename(bill_length_mm_2007 = bill_length_mm,
         bill_depth_mm_2007  = bill_depth_mm,
         flipper_length_mm_2007 = flipper_length_mm)
## # A tibble: 110 × 4
##   bill_length_mm_2007 bill_depth_mm_2007 flipper_length_mm_2007
##                 <dbl>              <dbl>                  <int>
## 1                39.1               18.7                    181
## 2                39.5               17.4                    186
## 3                40.3               18                      195
## # ℹ 107 more rows
## # ℹ 1 more variable: year <int>

3.4.1 【効率化】str_c()で一括指定

  • rename_with()の中で適用したい関数の中にある「x」の部分に,その後選ぶ列が入っていく
  • stringr::str_c()で指定した語をくっつける
  • ここでは変数”year”以外すべてなので,“year”に「!」をつけることで変数を指定できる
df |> 
  filter(year == 2007) |> 
  select(bill_length_mm:flipper_length_mm, year) |> 
  rename_with(\(x) str_c(x, "_2007"),
               !year)
## # A tibble: 110 × 4
##   bill_length_mm_2007 bill_depth_mm_2007 flipper_length_mm_2007
##                 <dbl>              <dbl>                  <int>
## 1                39.1               18.7                    181
## 2                39.5               17.4                    186
## 3                40.3               18                      195
## # ℹ 107 more rows
## # ℹ 1 more variable: year <int>

3.4.1.1 【別解】

  • 変数を選ぶときに該当する単語を持つ変数を選びたければ,ヘルパー関数matches()で正規表現を使って柔軟に選べる
df |> 
filter(year == 2007) |> 
  rename_with(\(x) str_c(x, "_2007"),
               matches("bill|flipper"))
## # A tibble: 110 × 8
##   species island    bill_length_mm_2007 bill_depth_mm_2007
##   <fct>   <fct>                   <dbl>              <dbl>
## 1 Adelie  Torgersen                39.1               18.7
## 2 Adelie  Torgersen                39.5               17.4
## 3 Adelie  Torgersen                40.3               18  
## # ℹ 107 more rows
## # ℹ 4 more variables: flipper_length_mm_2007 <int>,
## #   body_mass_g <int>, sex <fct>, year <int>

3.4.2 [練習問題]

  • dfデータの変数yearで2008年のみのデータに限定し,くちばし(bill)と翼(flipper)で始まる変数以外の変数名の頭に”year08_“をつけてみよう