京橋のバイオインフォマティシャンの日常

まずは、データ分析、コマンドラインのメモとして

【Rのジミ〜な小技シリーズ】データ解析の前処理で悩まされるデータ重複の問題を扱ってみた件

本記事は、

skume.hatenablog.com

の続編である。

さて、これからデータ解析を始めようかという時に、まずやることは該当データのクオリティチェック(品質評価)だろう。

クオリティチェックと言っても、いろいろな方法・考え方があって、データによって様々である。

今回は、最も基本である、データ重複の問題を扱ってみる。

今回の内容

練習データの準備

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

まとめ

この記事 + α は毎回やる必要があるので、覚えておくと良い。

参考資料

a-habakiri.hateblo.jp

qiita.com

jojoshin.hatenablog.com