library(tidyverse)
# あるいは
# library(dplyr)はじめに
今回は{dplyr}パッケージのrecode()関数を紹介します。
例えばデータフレーム内の変数がカテゴリ変数で、便宜的に数値で表されているような場合、そのまま表に出すことはできないかもしれません。
そんなときに中身を置き換える手段として使えるのがrecode()関数で、イメージとしてはcase_when()と似ているかもしれません1。
1度きりの変換であればcase_whenでもあまり労力は変わらないかもしれませんが、何回も繰り返し置き換えたいときは、シンプルで強みを発揮します。
使い方
パッケージ
{dplyr}に入っているので、{tidyverse}を読み込んでいれば使えます。
データフレーム
今回は以下のようなデータフレームを想定します。
df <- tibble(
id = 1:4,
sex = rep(1:2, times = 2)
)| id | sex |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
超絶簡単なデータフレームです。4人のIDと性別が1, 2の表記で含まれているだけです。ここで1を男性、2を女性とします。
対応表を作る
これを表に起こしたいとき、たとえばそのままtinytable::tt()で表示したとしたら、 表 1 がそのまま出てきてしまい、数字が誰を、何を表しているのかがわかりませんよね。
そこで、あらかじめ対応表を作って置きます。
id_map <- c(
"1" = "Michael",
"2" = "Emily",
"3" = "John",
"4" = "Jessica"
)
sex_map <- c(
"1" = "Male",
"2" = "Female"
)c()の中に、=の左にデータフレーム内の表記を、右に表示したい表記を書いていきます。
今回はIDと性別を両方書き換えたいので、2種類の対応関係を示したベクトルを作成しています。
recode()を使う
この対応表をもとに、recode()関数を使っていきます。使う際は、mutate()と組み合わせます。
df_recode <- df |>
mutate(
id = recode(id, !!!id_map),
sex = recode(sex, !!!sex_map)
)recode()を使用した表
| id | sex |
|---|---|
| Michael | Male |
| Emily | Female |
| John | Male |
| Jessica | Female |
しっかり置き換えられていますね。
!!!という表記は見慣れないと思いますが、id_mapやsex_mapで作成したベクトルをバラバラにして渡すということです2。recode(sex, "1" = "Male", "2" = "Female")と同じ働きをします。
あらかじめ対応関係を表すベクトルを作って置くことで、使いまわすことができ、特に何回も表を作る際に効率化が図れます。
おまけ
表にするなら、列名も変えたいですよね。そんなときは{purrr}パッケージのset_names()関数を使います。これも{tidyverse}に入っていますので、特に追加でライブラリを読み込む必要はありません。
col_names <- c("名前", "性別")
df_set_names <- df_recode |>
set_names(col_names)| 名前 | 性別 |
|---|---|
| Michael | Male |
| Emily | Female |
| John | Male |
| Jessica | Female |
あらかじめcol_namesを作成しておきましたが、ここは任意です。set_names()の中に直接書くのも可能です。
おわりに
今回は表を整えるためのrecode()関数とおまけのset_names()関数をまとめました。
以前Quartoで論文を書くという記事を書きましたが、論文はLaTeXで書きたい!という方には表だけLaTeXコードにして出力するという方法もありますので、それもまたまとめようかと思います。