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 【別解】
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.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>