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 関数の引数の意味は以下の通りである。

  1. 最初の引数は、扱いたいデータフレームである(ここでは questionnaire_results)。
  2. 次の引数は、複数の値が入っているために分割したい列である(ここでは "好きな飲み物")。
  3. type の引数は、分割したい列の型を指定している。
  4. drop の引数は、Tにすることで分割対象となる列を削除する。なお、この引数を特に指定しなければ、分割対象となる列は削除されない。
  5. fill の引数で当てはまらない場合に埋める値を指定する(ここでは 0 で埋めることを指定)。なお、この引数を特に指定しなければ、NA で埋められる。

なお、ここでは指定しなかったが、cSplit_e 関数の引数としては以下のものもある。