R言語でデータの重複削除を行う方法を紹介します。
重複しているデータの削除や、重複しているかを判定する関数とその使い方について解説します。
この記事では以下の内容が学べます。
ベクトルやデータフレームの重複削除、重複しているデータの判定及び取得について見ていきます。
この記事で学べる事
- ベクトルやデータフレームの重複削除
- 重複しているデータの取得
この記事で扱うプログラミングコードは以下からダウンロードできます。
データの重複削除
データの重複削除に用いる関数を紹介します。
ベクトルから重複している要素を削除する関数や、データが重複しているか判定する関数をまとめました。
関数unique
次の関数uniqueを用いることでデータの重複削除を行うことができます。
unique(x, incomparables = FALSE, …)
# S3 method for default
unique(x, incomparables = FALSE, fromLast = FALSE, nmax = NA, …)
# S3 method for matrix
unique(x, incomparables = FALSE, MARGIN = 1, fromLast = FALSE, …)
# S3 method for array
unique(x, incomparables = FALSE, MARGIN = 1, fromLast = FALSE, …)
uniqueの引数は以下の通りです。
x | ベクトルまたはデータフレーム、配列、NULL |
imcomparables | 重複削除に考慮しない値。FALSEの場合、すべての値を含めて重複削除を行う。 |
fromLast | logical型。重複削除を後ろのほうから行うかどうか。 |
nmax | 期待される一意な値の最大値。 |
... | 他のメソッドに渡す引数。 |
MARGIN | 1で行方向について重複削除、2で列方向に重複削除を行う。 |
関数duplicated
関数duplicatedで重複削除したデータの順位を取得することができます。
duplicated(x, incomparables = FALSE, …)
# S3 method for default
duplicated(x, incomparables = FALSE, fromLast = FALSE, nmax = NA, …)
# S3 method for array
duplicated(x, incomparables = FALSE, MARGIN = 1, fromLast = FALSE, …)
anyDuplicated(x, incomparables = FALSE, …)
# S3 method for default
anyDuplicated(x, incomparables = FALSE, fromLast = FALSE, …)
# S3 method for array
anyDuplicated(x, incomparables = FALSE, MARGIN = 1, fromLast = FALSE, …)
duplicatedの引数は以下の通りです。
x | ベクトルまたはデータフレーム、配列、NULL |
imcomparables | 重複の判定の際に考慮しない値。FALSEの場合、すべての値を含めて判定を行う。 |
fromLast | logical型。重複の判定を後ろのほうから行うかどうか。 |
nmax | 期待される一意な値の最大値。 |
... | 他のメソッドに渡す引数。 |
MARGIN | 1で行方向について重複しているかの判定、2で列方向に判定を行う。0の場合はxと同じ次元からなる配列を返す。 |
実行例
データの重複削除及びデータが重複しているかどうかの判定の方法についてまとめました。
ベクトルとデータセットの重複削除の実行例をいかにまとめました。
ベクトルの重複削除
まずは次のベクトルxに対し重複削除を行う方法を紹介します。
1 2 | x <- c("a", "e", "b", "c", "c", "a", "a", "e", "c", "d", "c", "c", "c", "a", "b", "e", "b", "d", "b", "c") |
上のようにxはA, B, Cなどの文字からなるベクトルです。
xを構成する文字、すなわちデータを構成する要素を取得するときは、重複削除が非常に便利です。
Rで重複削除を行うには次のように関数uniqueを使います。
uniqueの引数に重複削除したいデータを渡すだけです。
1 2 3 | > x_unique <- unique(x) > x_unique [1] "a" "e" "b" "c" "d" |
データが重複しているか判定したいときは関数duplicatedを用います。
重複しているデータのインデックスがTRUE、していないインデックスがFALSEであるようなlogical型のベクトルを取得することができます。
1 2 3 | > isDuplicated_x <- duplicated(x) > isDuplicated_x [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE |
また、次のようにduplicatedによって重複削除を行うことも可能です。
1 2 | > x[!isDuplicated_x] #duplicatedを使った重複削除 [1] "a" "e" "b" "c" "d" |
データフレームの重複削除
データフレームの行・列に関して重複削除を行う方法と、行・列の各要素について重複削除を行う方法を紹介します。
行について重複削除(ベクトル単位)
次のデータフレームdataset1を例に行について重複削除する方法を解説します。
1 2 | dataset1 <- data.frame(letters = c("a", "c", "a", "b", "b"), numbers = c(3, 1, 3, 4, 2), dates = as.Date(c("2022-08-25", "2022-08-23", "2022-08-25","2022-08-28","2022-08-26"))) |
下のようにdataset1は行について同じデータを持つことが確認できます。
1 2 3 4 5 6 7 | > dataset1 letters numbers dates 1 a 3 2022-08-25 2 c 1 2022-08-23 3 a 3 2022-08-25 4 b 4 2022-08-28 5 b 2 2022-08-26 |
行方向について重複削除を行うには、次のように関数unique引数xに重複削除したいデータフレームを渡します。
1 2 3 4 5 6 7 | > dataset1_rowUnique <- unique(dataset1) #uniqueを使った重複削除 > dataset1_rowUnique letters numbers dates 1 a 3 2022-08-25 2 c 1 2022-08-23 4 b 4 2022-08-28 5 b 2 2022-08-26 |
関数duplicatedでも次のように行について重複削除を行うことができます。
1 2 3 4 5 6 | > dataset1[!duplicated(as.matrix(dataset1)), ] #duplicatedを使った重複削除 letters numbers dates 1 a 3 2022-08-25 2 c 1 2022-08-23 4 b 4 2022-08-28 5 b 2 2022-08-26 |
列について重複削除(ベクトル単位)
また、次の同じ列を持つデータセットdataset2を列について重複削除を行っていきます。
1 2 | dataset2 <- data.frame(letters1 = letters[seq_len(10)], numbers = seq_len(10), letters2 = letters[seq_len(10)], dates = seq(as.Date("2022-08-25"), by = "day", length.out = 10)) |
列方向について重複削除を行うには、次のように関数duplicatedの引数xにデータセットを渡し、引数MARGINを2にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 | > dataset2_colUnique <- dataset2[, !duplicated(as.matrix(dataset2), MARGIN = 2)] > dataset2_colUnique letters1 numbers dates 1 a 1 2022-08-25 2 b 2 2022-08-26 3 c 3 2022-08-27 4 d 4 2022-08-28 5 e 5 2022-08-29 6 f 6 2022-08-30 7 g 7 2022-08-31 8 h 8 2022-09-01 9 i 9 2022-09-02 10 j 10 2022-09-03 |
同じ列のデータがなくなっているのが分かります。
行・列の各要素について重複削除
さらに、次のデータセットesophを例に各行、列について要素単位で重複削除を行う例についても解説します。
1 2 3 4 5 6 7 8 9 | > dataset3 <- esoph > head(dataset3) agegp alcgp tobgp ncases ncontrols 1 25-34 0-39g/day 0-9g/day 0 40 2 25-34 0-39g/day 10-19 0 10 3 25-34 0-39g/day 20-29 0 6 4 25-34 0-39g/day 30+ 0 5 5 25-34 40-79 0-9g/day 0 27 6 25-34 40-79 10-19 0 7 |
これまで、行または列方向についてデータセットをベクトル単位で重複削除してきましたが、次のように関数applyを併用することで行または列の要素単位で重複削除を実施することが可能です。
次を実行すると行の各要素について重複削除を行うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | > uniqueRows <- apply(dataset3, 1, unique) #行に対し重複削除 > head(uniqueRows) [[1]] [1] "25-34" "0-39g/day" "0-9g/day" " 0" "40" [[2]] [1] "25-34" "0-39g/day" "10-19" " 0" "10" [[3]] [1] "25-34" "0-39g/day" "20-29" " 0" " 6" [[4]] [1] "25-34" "0-39g/day" "30+" " 0" " 5" [[5]] [1] "25-34" "40-79" "0-9g/day" " 0" "27" [[6]] [1] "25-34" "40-79" "10-19" " 0" " 7" |
各行の重複削除後の値を得たいときは、次のようにリストuniqueRowsに各行名を渡します。
1 2 | > uniqueRows[[1]] #1行目の重複削除後の要素 [1] "25-34" "0-39g/day" "0-9g/day" " 0" "40" |
列の各要素についての重複削除は以下のように実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | > uniqueCols <- apply(dataset3, 2, unique) #列に対し重複削除 > uniqueCols $agegp [1] "25-34" "35-44" "45-54" "55-64" "65-74" "75+" $alcgp [1] "0-39g/day" "40-79" "80-119" "120+" $tobgp [1] "0-9g/day" "10-19" "20-29" "30+" $ncases [1] " 0" " 1" " 3" " 2" " 6" " 4" " 5" " 9" " 8" "17" $ncontrols [1] "40" "10" " 6" " 5" "27" " 7" " 4" " 2" " 1" "60" "14" " 8" "35" "23" "11" " 3" "46" "18" "38" "21" "15" "16" "49" "22" "12" "17" "48" "34" " 9" "13" |
同様に、各列の重複削除後の値を取得したいときは、リストuniqueColsに列名を渡します。
1 2 | > uniqueCols[["agegp"]] #agegpの重複削除後の要素 [1] "25-34" "35-44" "45-54" "55-64" "65-74" "75+" |
まとめ
R言語で重複削除や重複しているかの判定を行う関数とその使い方について見ていきました。
関数uniqueでデータの重複削除、duplicatedでデータが重複しているかどうかの判定を行うことができます。