R で1つのセルに複数の値が入っている場合に、複数の列にわたるダミー変数にする
概要
1つのセルにコンマ区切りなどで複数の値が入っている場合、splitstackshape パッケージの cSplit_e 関数で、複数の列にわたるダミー変数の形に改めることができる。
今回扱いたいデータ
表型のデータで、1つのセルに複数の値が入っている場合がある。例えば、以下の例を見てみよう。太郎の好きな飲み物は「牛乳,紅茶」というコンマ区切りで1つのセルに値が入ってしまっている。
| 名前 | 性別 | 好きな飲み物 |
|---|---|---|
| 太郎 | 男 | 牛乳,紅茶 |
| 次郎 | 男 | 紅茶 |
| 三郎 | 男 | コーヒー,緑茶 |
| 春子 | 女 | 緑茶,紅茶,コーヒー |
| 夏子 | 女 | コーヒー |
| 秋子 | 女 | |
| 冬子 | 女 | 緑茶,紅茶 |
このままだと、集計・分析するのが大変である。例えば、牛乳が好きな人が何人いるかを数えるだけでも面倒なのだ。
こういった場合、以下のように、複数の列にわたるダミー変数にすると集計・分析しやすくなる。
| 名前 | 性別 | 好きな飲み物_コーヒー | 好きな飲み物_牛乳 | 好きな飲み物_紅茶 | 好きな飲み物_緑茶 |
|---|---|---|---|---|---|
| 太郎 | 男 | 0 | 1 | 1 | 0 |
| 次郎 | 男 | 0 | 0 | 1 | 0 |
| 三郎 | 男 | 1 | 0 | 0 | 1 |
| 春子 | 女 | 1 | 0 | 1 | 1 |
| 夏子 | 女 | 1 | 0 | 0 | 0 |
| 秋子 | 女 | 0 | 0 | 0 | 0 |
| 冬子 | 女 | 0 | 0 | 1 | 1 |
Rでこうするには、splitstackshape パッケージの cSplit_e 関数を用いると良い。splitstackshape パッケージをインストールしていなかったら、install.pakcages("splitstackshape") でCRANからインストールしておこう。
複数の列にわたるダミー変数への変換
複数の列にわたるダミー変数への変換は次のようにして行えば良い。このスクリプトを実行すると、questionnaire_results_reshaped に複数の列にわたるダミー変数への変換を済ませたデータフレームが代入される。
library("splitstackshape")
# データの準備
questionnaire_results <-
data.frame(名前 = c("太郎", "次郎", "三郎", "春子", "夏子", "秋子", "冬子"),
性別 = c("男", "男", "男", "女", "女", "女", "女"),
好きな飲み物 = c("牛乳,紅茶", "紅茶", "コーヒー,緑茶", "緑茶,紅茶,コーヒー", "コーヒー", "", "緑茶,紅茶"))
# 複数の列にわたるダミー変数に変換
questionnaire_results_reshaped <-
cSplit_e(questionnaire_results,
"好きな飲み物", type = "character", drop = T, fill = 0)
上記のスクリプトの中の cSplit_e 関数の引数の意味は以下の通りである。
- 最初の引数は、扱いたいデータフレームである(ここでは
questionnaire_results)。 - 次の引数は、複数の値が入っているために分割したい列である(ここでは
"好きな飲み物")。 typeの引数は、分割したい列の型を指定している。dropの引数は、Tにすることで分割対象となる列を削除する。なお、この引数を特に指定しなければ、分割対象となる列は削除されない。fillの引数で当てはまらない場合に埋める値を指定する(ここでは 0 で埋めることを指定)。なお、この引数を特に指定しなければ、NA で埋められる。
なお、ここでは指定しなかったが、cSplit_e 関数の引数としては以下のものもある。
sep: 複数の値が入っているセルにおいて、値を区切るのに使われている文字を指定する際に使う。何も指定しなければ、コンマ区切りと見なされる。mode:binaryと指定すると、当てはまる場合に 1 が出力される。"value"と指定すると、当てはまる場合に元々の値が出力される(上述の例だと 1 の代わりに「牛乳」や「コーヒー」などが出力される)。何も指定しない場合は、binaryと同じである。