【R】Rで重複するデータを取り除く

R

今回は重複するデータが存在する時の、Rでの処理方法について紹介します。

重複しているデータを見つける

まずは、今回使用するサンプルデータを作成します。

下記のように名前、科目、点数が入ったデータです。

namesubjectscore
TaroEnglish77
TaroMath60
TaroMath60
JiroEnglish75
JiroEnglish80
HanakoMath88
HanakoMath81

重複データがあるかどうかは
dupulicated(データ)
で見つけることができます。

3つ目がTRUEになっているのでこのデータが重複しているということです。
今回のサンプルデータでは3行目の「Taro, Math, 60」のデータですね。

このように重複しているかどうかをTRUE/FALSEで返してくれるので、
sum(duplicated(データ))
とすることで、重複しているレコード数が分かります。

重複データの対処

すべてが重複しているデータを取り除く

duplicated()で確認した重複データは、全ての項目の値が同じものです。
このような全データが重複しているものを削除するにはdplyrパッケージの
distinct(データ)
を使います。

部分的に重複しているデータを取り除く

重複しているデータを扱うとき、すべてが重複しているだけではなく、特定の変数が重複しているものを削除したい場合もあります。

今回の例でいうと、JiroさんのEnglishと、HanakoさんのMathが2行ずつ残っています。
このような場合にもdistinctは使うことができ、
distinct(特定の列, .keep_all=TRUE)
と書きます。

nameとsubjectが重複しているものを削除したい場合のRの書き方は次のようになります。

JiroさんのEnglishと、HanakoさんのMathが1行ずつになっているのが確認できますね!

最後の「.keep_all」は全変数を残すオプションで、デフォルトではFALSEになっているため、記載しない場合は選択した変数しか残らないようになります。
(今回の例でいうとnameとsubjectしか残らない。)

重複データの平均(または最大値、最小値など)を残す

先ほどの例だと、部分的な重複を削除した時、データフレームの上の行だけが残っています。
例えば、Jiroさんの場合は、もともとのデータでは75点と80点がありましたが、上に位置する75点のみが残りました。

ただ実際には、点数が高い方を残したい、平均点を残したい、など様々な要望があるかと思います。
そのような計算をした上で重複を削除する場合は次のように書きます。(例:平均を残す場合)
データ %>%
group_by(重複変数) %>%
mutate(新しい列 = mean()) %>%
distinct(重複変数, .keep_all=TRUE) %>%
select(-計算に使った変数)

mutateで計算した新しい列を作ったうえで重複を削除するのがポイントです。
大きい値を残す場合はmeanではなくmaxを使うなど、様々な集計に対応できます。
計算に使用した変数(今回のscore)は不要となるため、最後にselectで除外しています。

それでは今回のサンプルデータで、名前と科目が重複した場合は平均点を残すようにしてみましょう。

JiroさんとHanakoさんの重複していたデータが、平均値のみ残った形になっていますね!

重複データを扱う際に参考になれば幸いです!

コメント

タイトルとURLをコピーしました