今回扱いたいデータ
表型のデータで、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
と同じである。