recode関数でデータフレームの中身を置き換える

表を作るときに重宝するかも…?

R
データ処理
公開

2025年7月27日

はじめに

今回はdplyrパッケージのrecode()関数を紹介します。

例えばデータフレーム内の変数がカテゴリ変数で、便宜的に数値で表されているような場合、そのまま表に出すことはできないかもしれません。

そんなときに中身を置き換える手段として使えるのがrecode()関数で、イメージとしてはcase_when()と似ているかもしれません1

1度きりの変換であればcase_whenでもあまり労力は変わらないかもしれませんが、何回も繰り返し置き換えたいときは、シンプルで強みを発揮します。

使い方

パッケージ

dplyrに入っているので、Tidyverseを読み込んでいれば使えます。

library(tidyverse)
# あるいは
# library(dplyr)

データフレーム

今回は以下のようなデータフレームを想定します。

df <- tibble(
  id = 1:4, 
  sex = rep(1:2, times = 2)
)
表 1: テーブルの例
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)
  )
表 2: recode()を使用した表
id sex
Michael Male
Emily Female
John Male
Jessica Female

しっかり置き換えられていますね。

!!!という表記は見慣れないと思いますが、id_mapsex_mapで作成したベクトルをバラバラにして渡すということです2recode(sex, "1" = "Male", "2" = "Female")と同じ働きをします。

あらかじめ対応関係を表すベクトルを作って置くことで、使いまわすことができ、特に何回も表を作る際に効率化が図れます。

おまけ

表にするなら、列名も変えたいですよね。そんなときはpurrrパッケージのset_names()関数を使います。これもTidyverseに入っていますので、特に追加でライブラリを読み込む必要はありません。

col_names <- c("名前", "性別")

df_set_names <- df_recode |> 
  set_names(col_names)
表 3: 列名を変更
名前 性別
Michael Male
Emily Female
John Male
Jessica Female

あらかじめcol_namesを作成しておきましたが、ここは任意です。set_names()の中に直接書くのも可能です。

おわりに

今回は表を整えるためのrecode()関数とおまけのset_names()関数をまとめました。

以前Quartoで論文を書くという記事を書きましたが、論文はLaTeXで書きたい!という方には表だけLaTeXコードにして出力するという方法もありますので、それもまたまとめようかと思います。

  1. ただし、case_when()だと「○○以上○○以下」みたいな条件分岐に対応できるという強みがありますが、今回は想定しません。あくまでもデータフレーム内の値をある別の表記に値 = 値で置き換えるということを想定します。↩︎

  2. ややこしいですが、id_map自体はベクトルなので、ベクトルを渡すのではなく、中身を展開して渡したいということです。↩︎