R言語でデータフレームから重複行を削除する方法について解説します。このような方法はいくつかあり、R言語に標準で搭載されている機能を使用した方法もありますが、ここではtidyverseパッケージに含まれているdplyrパッケージのdistinct()を使用した方法についてお伝えします。distinct()を使用する利点は、パイプ演算子と親和性が高くR言語に標準で搭載されている機能を使用する方法よりも可読性が高いコードが書けることが挙げられます。

distinct()の概要

distinct()は、異なるまたは一意の行を保持する関数です。これは、データフレームから一意の行のみを保持します。これはunique.data.frame()に似ていますが、かなり高速です。

distinct()の使い方

まずは、distinct()の使い方について確認しておきます。


distinct(.data, ..., .keep_all = FALSE)

distinct()の引数の意味

.data

データフレームを指定します。

一意性を決定するときに使用する列を指定します。
特定の入力の組み合わせに複数の行がある場合、最初の行のみが保持されます。省略すると、データフレーム内のすべての列が使用されます。

.keep_all = FALSE

TRUEの場合、すべての変数を.dataに保持します。
もし…が明確でない場合は、値の最初の行が保持されます。

distinct()の戻り値

.dataと同じタイプのオブジェクトが返されます。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

解説のために、次のToothGrowthデータセットを使用します。


ToothGrowth |> head()

   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5

ToothGrowthデータセットの行数を確認しておきます。


ToothGrowth |> nrow()

[1] 60

すべての列で重複行を削除

すべての列で重複行を削除するには次のようにします。


ToothGrowth |>
  distinct() |>
  head()

   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5

このときの行数は次になります。


ToothGrowth |>
  distinct() |>
  nrow()

[1] 55

1つの対象列から重複行を削除

列suppに対して重複行を削除するには次のようにします。


ToothGrowth |>
  distinct(supp) |>
  head()

  supp
1   VC
2   OJ

この操作は、1つの対象列に対して、一意的な値を取得する関数unique()とほぼ同様です。違いは、distinct()はデータフレームが返されるのに対して、unique()はベクトルが返る点です。
対象列以外の列も返されるようにするには、引数に「.keep_all = TRUE」を指定します。ただし、対象でない列は対象列が一意的となる場合の最初の行のみとなることに注意してください。


ToothGrowth |>
  distinct(supp, .keep_all = TRUE) |>
  head()

   len supp dose
1  4.2   VC  0.5
2 15.2   OJ  0.5

複数の対象列から重複行を削除

列suppとdoseに対して重複行を削除するには次のようにします。


ToothGrowth |>
  distinct(supp, dose) |>
  head()

  supp dose
1   VC  0.5
2   VC  1.0
3   VC  2.0
4   OJ  0.5
5   OJ  1.0
6   OJ  2.0

同様に、対象列以外の列も返されるようにするには、引数に「.keep_all = TRUE」を指定します。ただし、対象でない列は対象列が一意的となる場合の最初の行のみとなることに注意してください。


ToothGrowth |>
  distinct(supp, dose, .keep_all = TRUE) |>
  head()

   len supp dose
1  4.2   VC  0.5
2 16.5   VC  1.0
3 23.6   VC  2.0
4 15.2   OJ  0.5
5 19.7   OJ  1.0
R入門 データフレームから重複行を削除する方法