Rのinteraction関数で重複チェックするときは、drop=Tを指定する

前回の記事で、データフレームの重複をチェックするときに、interaction関数を使うという方法を紹介しました↓

Rのデータフレームで複数項目を組み合わせた重複のチェック


例えば、こんな↓データだったら、

> d
   名字 名前 年齢 出身         職業
1  佐藤 一郎   20 埼玉   アルバイト
2  武藤 二郎   22 大阪         学生
3  加藤 三郎   25 愛知       会社員
4  伊東 四郎   77 東京 コメディアン
5  近藤 五郎   32 千葉         無職
6  後藤 太郎   33 兵庫       公務員
7  工藤 次郎   35 福岡     専業主夫
8  須藤 三朗   38 静岡       自営業
9  遠藤 史郎   52 茨城     会社役員
10 斉藤 吾郎   83 広島     定年退職


↓こんなふうにして、

> intr <- interaction(d$名字, d$名前, d$年齢, d$出身, d$職業, drop=T)
> sum(duplicated(intr))

[1] 0

TRUEの数がゼロだから重複なしだな、みたいな。

で、前回の記事でも上記のサンプルでも、interaction関数にさりげなく、drop=Tオプションを指定していますが、これが結構重要です。何も指定していないと、デフォルトはdrop=Fです。

両者で実行結果を比較してみましょう。

↓まずはdrop=Tで、

> interaction(d$名字, d$名前, d$年齢, d$出身, d$職業, drop=T)
 [1] 佐藤.一郎.20.埼玉.アルバイト   武藤.二郎.22.大阪.学生       
 [3] 加藤.三郎.25.愛知.会社員       伊東.四郎.77.東京.コメディアン
 [5] 近藤.五郎.32.千葉.無職         後藤.太郎.33.兵庫.公務員     
 [7] 工藤.次郎.35.福岡.専業主夫     須藤.三朗.38.静岡.自営業     
 [9] 遠藤.史郎.52.茨城.会社役員     斉藤.吾郎.83.広島.定年退職   
10 Levels: 佐藤.一郎.20.埼玉.アルバイト ... 近藤.五郎.32.千葉.無職


↓次はdrop=Fで、

> interaction(d$名字, d$名前, d$年齢, d$出身, d$職業, drop=F)
 [1] 佐藤.一郎.20.埼玉.アルバイト   武藤.二郎.22.大阪.学生       
 [3] 加藤.三郎.25.愛知.会社員       伊東.四郎.77.東京.コメディアン
 [5] 近藤.五郎.32.千葉.無職         後藤.太郎.33.兵庫.公務員     
 [7] 工藤.次郎.35.福岡.専業主夫     須藤.三朗.38.静岡.自営業     
 [9] 遠藤.史郎.52.茨城.会社役員     斉藤.吾郎.83.広島.定年退職   
100000 Levels: 伊東.一郎.20.愛知.アルバイト ... 武藤.二郎.83.兵庫.無職


大して変わらないじゃないかと言われそうですが、実行時間が大きく違います。前者は一瞬で結果が出るのですが、後者の実行には私の環境では3秒くらいかかりました。

3秒くらいだったら我慢できるでしょうが、これがあと2,3列増えるだけで、作業するには現実的でないような実行時間に陥ってしまいます。

drop=Fを指定すると、データ上には存在しないものも含めて、全ての組み合わせを水準として保持します。

100000 Levels: 伊東.一郎.20.愛知.アルバイト ... 武藤.二郎.83.兵庫.無職

とあるように、名字が10種類、名前が10種類、年齢が10種類、出身が10種類、職業が10種類あるので、10×10×10×10×10 = 10万 の水準が作られます。これが時間を食う原因になっているようです。

目的が重複のチェックだけだったら、存在しない組み合わせの水準は必要ないので、drop=Fと指定すれば、大抵の場合は一瞬で組み合わせ因子が作れるはずです。

コメント

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法