2015年2月1日日曜日

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

例えば、↓こんな感じのデータフレームがあったとします。

> d
   名字 名前 年齢
1  伊東 二郎   52
2  佐藤 五郎   52
3  遠藤 太郎   53
4  後藤 太郎   53
5  近藤 五郎   28
6  遠藤 二郎   33
7  後藤 四郎   52
8  須藤 次郎   28
伊東 二郎   35
10 遠藤 太郎   23
11 遠藤 史郎   38
12 工藤 吾郎   53
13 須藤 太郎   22
14 武藤 二郎   28
15 工藤 吾郎   53
16 伊東 二郎   22
17 遠藤 四郎   33
18 後藤 史郎   38
19 加藤 一郎   28
20 加藤 二郎   22

仮に、名字と名前と年齢の一致によって個人を特定できるとし、このデータに重複がないかチェックをしたいということにします。

全項目を加味した重複チェックを行うのは実は簡単で、duplicated関数の引数にデータフレームを渡してやればOKです。TRUEがあれば重複があるということになります↓

> duplicated(d) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[11] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE


重複の有無を一目で確認したいときは、sum関数を使います。1以上なら重複ありということになります↓

> sum(duplicated(d))
[1] 1

重複したのがどの行だったのか見たい場合は、↓こんな感じでしょうか。

> d[duplicated(d), ]
   名字 名前 年齢
15 工藤 吾郎   53

データフレームの全項目ではなく、一部の項目の組み合わせでの重複チェックをしたい場合は、interaction関数を使ってそれらの項目を組み合わせた因子を作って、それをIDのように扱うという方法もあります。

年齢の項目は無視して、同姓同名を見つけたいような場合は、名字と名前の2つを組み合わせた因子の項目を作ります。

> d$ID <- interaction(d$名字, d$名前, drop=T)
> d
   名字 名前 年齢        ID
伊東 二郎   52 伊東.二郎
2  佐藤 五郎   52 佐藤.五郎
3  遠藤 太郎   53 遠藤.太郎
4  後藤 太郎   53 後藤.太郎
5  近藤 五郎   28 近藤.五郎
6  遠藤 二郎   33 遠藤.二郎
7  後藤 四郎   52 後藤.四郎
8  須藤 次郎   28 須藤.次郎
伊東 二郎   35 伊東.二郎
10 遠藤 太郎   23 遠藤.太郎
11 遠藤 史郎   38 遠藤.史郎
12 工藤 吾郎   53 工藤.吾郎
13 須藤 太郎   22 須藤.太郎
14 武藤 二郎   28 武藤.二郎
15 工藤 吾郎   53 工藤.吾郎
16 伊東 二郎   22 伊東.二郎
17 遠藤 四郎   33 遠藤.四郎
18 後藤 史郎   38 後藤.史郎
19 加藤 一郎   28 加藤.一郎
20 加藤 二郎   22 加藤.二郎

> duplicated(d$ID)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
[11] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE


> sum(duplicated(d$ID))
[1] 4

ちなみに、サンプルのデータはsample関数を使って、組み合わせをランダムに生成して作ったのですが、「伊東四郎」は現れませんでした。■

[2015年2月7日追記]
 サンプルコードにつけている「drop=T」は結構重要だという話↓
Rのinteraction関数で重複チェックするときは、drop=Tを指定する - Rプログラミングの小ネタ

■ 

[2015年2月19日追記]
重複の有無だけでなく、どれが重複したのかちゃんと確認するところまで、サンプルを作ってみました↓

Rのduplicated関数を使ってデータフレームの重複チェック(改) - Rプログラミングの小ネタ




0 件のコメント:

コメントを投稿