Rのデータフレームで複数項目を組み合わせた重複のチェック
例えば、↓こんな感じのデータフレームがあったとします。
> d
名字 名前 年齢
1 伊東 二郎 52
2 佐藤 五郎 52
3 遠藤 太郎 53
4 後藤 太郎 53
5 近藤 五郎 28
6 遠藤 二郎 33
7 後藤 四郎 52
8 須藤 次郎 28
9 伊東 二郎 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
1 伊東 二郎 52 伊東.二郎
2 佐藤 五郎 52 佐藤.五郎
3 遠藤 太郎 53 遠藤.太郎
4 後藤 太郎 53 後藤.太郎
5 近藤 五郎 28 近藤.五郎
6 遠藤 二郎 33 遠藤.二郎
7 後藤 四郎 52 後藤.四郎
8 須藤 次郎 28 須藤.次郎
9 伊東 二郎 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プログラミングの小ネタ
■
> d
名字 名前 年齢
1 伊東 二郎 52
2 佐藤 五郎 52
3 遠藤 太郎 53
4 後藤 太郎 53
5 近藤 五郎 28
6 遠藤 二郎 33
7 後藤 四郎 52
8 須藤 次郎 28
9 伊東 二郎 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
1 伊東 二郎 52 伊東.二郎
2 佐藤 五郎 52 佐藤.五郎
3 遠藤 太郎 53 遠藤.太郎
4 後藤 太郎 53 後藤.太郎
5 近藤 五郎 28 近藤.五郎
6 遠藤 二郎 33 遠藤.二郎
7 後藤 四郎 52 後藤.四郎
8 須藤 次郎 28 須藤.次郎
9 伊東 二郎 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プログラミングの小ネタ
■
コメント
コメントを投稿