r tidyverse 使い方 | データフレーム重複行を削除 distinct関数 – dplyrパッケージ

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関数で同じように重複チェックが可能。