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>