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