levels()

因子型の要素を取り出す

因子型Factorの中身を見たいときに使う。

levels(df$field)

例えば、仕訳データで勘定科目一覧を取り出すなどで使える。

但し、デフォルトでは文字コードの順番に出力されるはずである。

例えば、

Cr Dr     # アルファベットの順
female male    # アルファベットの順
秋・夏・春・冬 # 漢字の文字コード順

などの順番で出てくると使いづらい(男女の順序については異論があるかもしれないが。)。

勘定科目などは、漢字コードの順番ではなく、資産・負債・純資産の順番(つまり科目コード順)で出てほしい。

実は因子型のデータの実態は整数型なので、順番を与えることもできる。

df$field <- factor(field, levels=c("春","夏","秋","冬"))

とすれば、fieldの値に因子の順序を与えることができる。都道府県名を北から南に向かって並べるなどの時にも使える。

なお、通常は何らかのベクトルが既に存在し、それをそのまま使うか何らか並べ替えて使うことが多いだろう。

上の季節の順序に相当する部分を逆順にしたいときは、rev()をつかって入れ替える。

factor(field, levels = rev(c("春","夏","秋","冬"))

具体例

  • デフォルトでは与えたデータがそのままの順で表示され、裏で文字コード順に整数がLevelとして割り当てられる。
> factor(c("徳川","織田","武田","豊臣"))
[1] 徳川 織田 武田 豊臣
Levels: 織田 徳川 武田 豊臣
  • 与える整数をなにかの順序で整頓したい場合、その順序をlevelsで与えてやる。

表示は依然として入力順だが、裏のLevelが上の文字列順とは異なっている。

> factor(c("徳川","織田","武田","豊臣"), levels=c("武田","織田","豊臣","徳川"))
[1] 徳川 織田 武田 豊臣
Levels: 武田 織田 豊臣 徳川
  • 表示名(ラベル)を含めて変更したい場合、与えるLevelに合わせてLabelを与える。

表示されているものが元のデータではなくラベル表示になっている(依然として並びは入力順だが)

> factor(c("徳川","織田","武田","豊臣"), levels=c("武田","織田","豊臣","徳川"), labels=c("信玄","信長","秀吉","家康"))
[1] 家康 信長 信玄 秀吉
Levels: 信玄 信長 秀吉 家康

この挙動についてr-wakalangで以下のようなことを教わった。

  • 1:n のintに"変換"する行為である
  • 1:n に対応する要素ベクトルをlevelsで与える
  • 表示をlevelsそのまま以外にしたい場合はlabelsで与える (いうまでもなく、1:nに対応する)
  • デフォルトでは levels = labels = sort(uniqe(対象)) である

[オブジェクト操作]