備忘ログ

チラシの裏的備忘録&メモ

RでExcelのLOOKUP関数のように対応表として値を別のデータフレームを参照して列を追加する方法について

RでExcelのLOOKUP関数のように対応表として値をデータフレームでもっているの場合に、対応している値を参照して列を追加する方法について考えてみる。小ネタ。

次のQiitaの記事を読んで思った。

qiita.com

いろいろな手法が考えられるが、{dplyr}を使うのであればleft_join()が比較的シンプルに書けると思う。

NAは0で埋めたいようなので{tidyr}replace_na()を使うことにする。ついでに、表示される列名をSP_noにするために、rename()しておく。

具体的には次の通り。

library(dplyr)
## 
##  次のパッケージを付け加えます: 'dplyr'

##  以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter, lag

##  以下のオブジェクトは 'package:base' からマスクされています:
## 
##     intersect, setdiff, setequal, union
library(tidyr)

df <- data.frame(
  SP_name = c("ブナ", "スギ", "ヒノキ", "", "スギ", "コナラ", "", "ヒノキ", "ブナ", "コナラ"),
  SP_no = NA
)
SP_table <- data.frame(
  name = c("スギ", "ヒノキ", "カラマツ", "ブナ", "コナラ", "ミズナラ"),
  no = 1:6
)

df <- left_join(df[1], SP_table, by = join_by(SP_name == name)) |> 
  replace_na(list(no = 0)) |> 
  rename(SP_no = no)
df
##    SP_name SP_no
## 1     ブナ     4
## 2     スギ     1
## 3   ヒノキ     2
## 4              0
## 5     スギ     1
## 6   コナラ     5
## 7              0
## 8   ヒノキ     2
## 9     ブナ     4
## 10  コナラ     5

もとの記事内で紹介されている手法でも特段に問題はないが、せっかくデータフレームで対応表を持っているのに何度も$でデータフレームの中身をベクトルで呼び出したりしているので、「あ、対照表まちがってたわー。他のデータフレームだったわー」とか「指定する列まちがってたわー」などあったときに書き直さなければならない箇所がやや多い気がする。