LoginSignup
1
1

Rでベクトルの各要素を別のデータシートを参照してナンバリングする

Last updated at Posted at 2023-08-29

はじめに

  • 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関数でデータフレームの種名が対応表の種名のそれぞれ何番目に当たるかを抜き出し、それをインデックスとして対応表の種ナンバーを抜き出します。

おわりに

いろいろ考えてこのやり方に落ち着きましたが、もしかしたら他にもっとスマートなやり方があるかもしれません。
参考になれば幸いです。

参考文献

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1