- はじめに
- ベクトル内で、データの重複があるかどうか?どう扱うか?
- 2つのベクトル間で、データの重複があるかどうか?・重複をどう扱うか?
- データフレーム内で、データの重複があるかどうか?・重複をどう扱うか?
- まとめ
- 参考資料
- 【Rのジミ〜な小技シリーズ】
はじめに
本記事は、
の続編である。
さて、これからデータ解析を始めようかという時に、まずやることは該当データのクオリティチェック(品質評価)だろう。
クオリティチェックと言っても、いろいろな方法・考え方があって、データによって様々である。
今回は、最も基本である、データ重複の問題を扱ってみる。
練習データの準備
X、Y、XY、Z
という変数を作成してみる。
#変数の作成 X <- c("A", "B", "C", "D", "E") Y <- c("G", "H", "A", "B", "I") XY <- c(X, Y) Z <- data.frame(V1=c("A", "B", "C", "D", "D", "D"), V2=c(1, 5, 3, 6, 6, 7), stringsAsFactors = F)
ベクトル内で、データの重複があるかどうか?どう扱うか?
ベクトルデータ内の重複があるかどうかは、まずはtable()
で確認する。
XY変数は、AとBが重複している。
table(XY) #XY #A B C D E G H I #2 2 1 1 1 1 1 1 table(table(XY) == 1) #FALSE TRUE # 2 6
一般的には、unique()
を使って、ベクトル内の重複を除く。
unique()
では、ベクトルの重複しない値・文字列を返してくれる
XY.u <- unique(XY) XY.u #[1] "A" "B" "C" "D" "E" "G" "H" "I" table(XY.u) #XY.u #A B C D E G H I #1 1 1 1 1 1 1 1 table(table(XY.u) == 1) #TRUE # 8
次に、duplicated()
を使って、ベクトル内の重複を除いてみる。
duplicated()
は重複を判定する関数であり、
その逆(!
)が重複を除いた結果を返すことになる。
!duplicated(XY) #[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE XY.d <- XY[!duplicated(XY)] XY.d table(XY.d) #XY.d #A B C D E G H I #1 1 1 1 1 1 1 1 table(table(XY.d) == 1) #TRUE # 8
2つのベクトル間で、データの重複があるかどうか?・重複をどう扱うか?
ここでは、intersect、setdiff、%in%
あたりをやってみる。
#XとYに共通する項目 intersect(X, Y) #[1] "A" "B" X[X %in% Y] #[1] "A" "B" #Xのみに含まれる項目 setdiff(X, Y) #[1] "C" "D" "E" X[!c(X %in% Y)] #[1] "C" "D" "E"
データフレーム内で、データの重複があるかどうか?・重複をどう扱うか?
unique()
を使って、データフレームのデータ重複を除いてみる。
unique()
でも出来ない事はない。
Z$V3 <- paste(Z$V1, ".", Z$V2, sep="") Z.u <- Z[as.numeric(rownames(unique(Z["V3"]))),] # V1 V2 V3 #1 A 1 A.1 #2 B 5 B.5 #3 C 3 C.3 #4 D 6 D.6 #6 D 7 D.7 #あるいは #or Z.u <- Z[rownames(unique(Z["V3"])),]
次に、duplicated()
を使って、データフレームのデータ重複を除いてみる。
duplicated()
では、複数列での重複をTRUE /FALSE
で返してくれるので、これはなかなか良い。
Z.d1 <- Z[!duplicated(Z[,1:2]),] Z.d1 # V1 V2 V3 #1 A 1 A.1 #2 B 5 B.5 #3 C 3 C.3 #4 D 6 D.6 #6 D 7 D.7 #あるいは Z.d2 <- Z[!duplicated(Z[,c("V1", "V2")]),] Z.d2
まとめ
この記事 + α は毎回やる必要があるので、覚えておくと良い。