符号から表示名に変換する

factorで値にラベルを貼る
R
公開

2023年4月13日

カテゴリ型の変数はたいていの場合、符号化されてデータに格納されます。

例えば毎日の天気を記録したデータに曜日の情報が入っていたとします。データは半角英数の方が何かと扱いやすいので、次のように曜日に便宜的に数字を割り当てたりするのはよくあることです。

1 月曜日
2 火曜日
3 水曜日
4 木曜日
5 金曜日
6 土曜日
7 日曜日

さらに天気にアルファベットを割り当ててあったとしましょう。このように割り当てられた値は符号と呼ばれます。

s 晴れ
c くもり
r

疑似データを作る

1か月(30日)の天気を記録したデータを擬似的に作ります。

report <- data.frame(date=1:30, day=(1:30)%%7+1, weather=sample(c("s", "c", "r"), 30, replace=TRUE, prob=c(5,3,2)))
head(report)
  date day weather
1    1   2       c
2    2   3       r
3    3   4       s
4    4   5       c
5    5   6       s
6    6   7       c

曜日別に天気をカウントしてみましょう。

table(report[c("day", "weather")])
   weather
day c r s
  1 2 2 0
  2 3 1 1
  3 0 2 3
  4 2 0 2
  5 1 1 2
  6 0 0 4
  7 2 0 2

1人で分析しているときはこれでもよいのですが、この集計表を他人に見せたりする際にはそれぞれの符号が何を意味しているのかの説明が必要になります。符号のままでは見づらいので、その意味を表示させたいことが多いでしょう。そんなときはどうしたらいいでしょうか。

符号の名前を表示する

factorのlabelsオプションを使うと符号の表示名を置き換えることができます。

report$day <- factor(report$day, levels=1:7, labels=c("月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"))
table(report[c("day", "weather")])
        weather
day      c r s
  月曜日 2 2 0
  火曜日 3 1 1
  水曜日 0 2 3
  木曜日 2 0 2
  金曜日 1 1 2
  土曜日 0 0 4
  日曜日 2 0 2

このように曜日の1~7を月曜日~日曜日に置き換えられました。

ところで集計表の天気を見ると、cが最初に来ています。これはアルファベット順になるからですが、晴れの符号のsを最初に持ってきたいですね。そういった順番の制御もfactor型で行うことができます。

符号を任意の順番で並べ替える

levelsで順番を指定しつつ、labelsで表示名を置き換えてみましょう。

report$weather <- factor(report$weather, levels=c("s","c","r"), labels=c("晴れ","くもり","雨"))
table(report[c("day", "weather")])
        weather
day      晴れ くもり 雨
  月曜日    0      2  2
  火曜日    1      3  1
  水曜日    3      0  2
  木曜日    2      2  0
  金曜日    2      1  1
  土曜日    4      0  0
  日曜日    2      2  0

このように晴れを前に出すことができました。levelsの順番はorderなどで並び替えをするときも有効なので、数字順やアルファベット順ではない任意の並べ方にしたいときに役に立ちます。

factor型をうまく使えば、分析結果を見やすく表示することができますね。