はじめに
- Rにおいて、データフレーム中の名前で記されたデータ列に対して、名前と番号の対応表を参照して、対応する番号の列を追加するやり方をメモします。
- 言葉で説明するのは難しいので実際の実装例を見たほうが早いです。
動作環境
- Windows10 64bit
- R (バージョン 4.0.5)
- dplyr (バージョン 1.0.10)
- RStudio (バージョン 2022.12.0)
R実装
前提となるデータフレームと対応表
- データフレームとして次のような表があります。
(実装用の例としてデータフレームを作っていますが、実際にはcsvなどの外部データから読み込んだりします。)
R
df <- data.frame(
SP_name = c("ブナ", "スギ", "ヒノキ", "", "スギ", "コナラ", "", "ヒノキ", "ブナ", "コナラ"),
SP_no = NA
)
df
SP_name SP_no
1 ブナ NA
2 スギ NA
3 ヒノキ NA
4 NA
5 スギ NA
6 コナラ NA
7 NA
8 ヒノキ NA
9 ブナ NA
10 コナラ NA
- 一方で、予め決まっている種名と種ナンバーの対応表があります。
(こちらも本来は外部データとして読み込むことが多いです。)
R
SP_table <- data.frame(
name = c("スギ", "ヒノキ", "カラマツ", "ブナ", "コナラ", "ミズナラ"),
no = 1:6
)
SP_table
name no
1 スギ 1
2 ヒノキ 2
3 カラマツ 3
4 ブナ 4
5 コナラ 5
6 ミズナラ 6
- 対応表を参照して、データフレームに種ナンバーの列を加えたいわけです。
- なお、対応表に存在しない行(この場合は種名が空欄の行)は
0
に置き換えるものとします。
データ処理
- 結論としては下記のコードでそれが実現できます。
R
df$SP_no <- if_else(df$SP_name %in% SP_table$name,
SP_table$no[match(df$SP_name, SP_table$name)],
as.integer(0))
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
中身の説明
- まず、データフレームの種名が対応表に存在するのかを論理値で評価します。
R
df$SP_name %in% SP_table$name
[1] TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE
- 論理値を
if_else
関数に渡して、真ならこの後の処理に渡し、偽なら0
とします。
R
SP_table$no[match(df$SP_name, SP_table$name)]
- 真の場合、
match
関数でデータフレームの種名が対応表の種名のそれぞれ何番目に当たるかを抜き出し、それをインデックスとして対応表の種ナンバーを抜き出します。
おわりに
いろいろ考えてこのやり方に落ち着きましたが、もしかしたら他にもっとスマートなやり方があるかもしれません。
参考になれば幸いです。
参考文献