tidyverseでデータフレームの重複行の削除を行う場合、dplyrパッケージのdistinct関数を使います。重複をチェックする列名を指定し、重複が見つかった行は最初に見つかったデータを残して、それ以外は削除されます。Rの標準的な操作なら、duplicated関数が同じように使えます。
重複行を削除する
dplyrパッケージのdistinct関数を使えば、データフレームから重複した行を初出以外は取り除くことができます。重複をチェックする列を指定します。tidyverseパッケージをロードすると使えるようになります。
書式
distinct関数は、第1引数にデータ、第2引数以降に重複チェックする列名を指定します。重複チェックの列は複数指定できます。オプションで、抽出が「重複した列のみ」か「重複した項目を含む行全体」かを指定できます。尚、パイプ(%>%)を使って連続的に処理を記述する場合は、第1引数のデータは省略することができます。
> distinct(データ, 重複チェック列名, オプション) > データ %>% distinct(重複チェック列名, オプション)
重複チェックとそれ以外の情報の扱い
重複情報のみ
distinct関数に「重複チェック列」のみを指定して、重複情報のみを取得しています。指定した列は、「Species」で、重複した列・行の初出の情報のみ得られています。
1: > iris %>% head 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 1 5.1 3.5 1.4 0.2 setosa 4: 2 4.9 3.0 1.4 0.2 setosa 5: 3 4.7 3.2 1.3 0.2 setosa 6: 4 4.6 3.1 1.5 0.2 setosa 7: 5 5.0 3.6 1.4 0.2 setosa 8: 6 5.4 3.9 1.7 0.4 setosa 9: > iris %>% distinct(Species) 10: Species 11: 1 setosa 12: 2 versicolor 13: 3 virginica
重複情報を含む行全体
distinct関数に「重複チェック列」と「行全体を返す」オプション指定して、重複情報を含む行を取得しています。指定した列は、「Species」で、重複した列・行の初出の情報のみ得られています。
1: > iris %>% distinct(Species, .keep_all=T) 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 1 5.1 3.5 1.4 0.2 setosa 4: 2 7.0 3.2 4.7 1.4 versicolor 5: 3 6.3 3.3 6.0 2.5 virginica
重複列を複数
distinct関数に「重複チェック列(複数)」と「行全体を返す」オプション指定して、重複情報を含む行を取得しています。指定した列は、「Species, Petal.Width」で、2つの情報の組み合わせで重複した列・行の初出の情報のみ得られています。
1: > iris %>% distinct(Species, Petal.Width, .keep_all=T) 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 1 5.1 3.5 1.4 0.2 setosa 4: 2 5.4 3.9 1.7 0.4 setosa 5: 3 4.6 3.4 1.4 0.3 setosa 6: 4 4.9 3.1 1.5 0.1 setosa 7: 5 5.1 3.3 1.7 0.5 setosa 8: 6 5.0 3.5 1.6 0.6 setosa 9: 7 7.0 3.2 4.7 1.4 versicolor 10: 8 6.4 3.2 4.5 1.5 versicolor 11: 9 5.5 2.3 4.0 1.3 versicolor 12: ...
Rの標準的な操作
データフレームに対して重複行の削除を行う場合、Rの標準的な方法ではduplicated関数を使います。データフレーム([行,列])の行にduplicated関数(重複行以外=ユニークな行の場合は、!duplicatedの評価とする)を指定します。duplicated関数には、重複チェックを行う列名を指定します。複数列で重複チェックをする場合は、データフレームを渡します。
1: > iris[!duplicated(iris$Species),] 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 1 5.1 3.5 1.4 0.2 setosa 4: 51 7.0 3.2 4.7 1.4 versicolor 5: 101 6.3 3.3 6.0 2.5 virginica
1: > iris[!duplicated(iris[,c(4,5)]),] 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 1 5.1 3.5 1.4 0.2 setosa 4: 6 5.4 3.9 1.7 0.4 setosa 5: 7 4.6 3.4 1.4 0.3 setosa 6: 10 4.9 3.1 1.5 0.1 setosa 7: 24 5.1 3.3 1.7 0.5 setosa 8: 44 5.0 3.5 1.6 0.6 setosa 9: 51 7.0 3.2 4.7 1.4 versicolor 10: 52 6.4 3.2 4.5 1.5 versicolor 11: 54 5.5 2.3 4.0 1.3 versicolor 12: ... 13: # distinct(iris, Species, Petal.Width, .keep_all=T) と同じ
まとめ
- tidyverseでデータフレームの重複行の削除を行う場合、dplyrパッケージのdistinct関数を使う。
- 重複チェックする列名を指定し、重複が見つかった行は初出を残して、それ以外は削除される。複数の列で重複チェックできる。
- 重複チェックでは、「重複情報のみ」か「重複を含む行」の抽出かをオプションで指定できる。
- Rの標準的な操作なら、duplicated関数で同じように重複チェックが可能。
論文・データ解析の支援
個別に直接相談できるのが良いと、たくさんの方にご利用頂いています。