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のデータフレームで複数項目を組み合わせた重複のチェック
例えば、こんな↓データだったら、
> 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と指定すれば、大抵の場合は一瞬で組み合わせ因子が作れるはずです。
コメント
コメントを投稿