Cari mendapatkan unik data atau penduaan menggunakan data.table. Caranya hampir sama dengan cara di base. Disini akan diterangkan cara pemakaian fungsi unique
dan duplicated
.
Unik
Untuk mendapatkan barisan yang unik di dataset atau unik di kolom tertentu sahaja boleh menggunakan fungsi unique
atau !duplicated
. Tunjukajar ini akan menggunakan data contoh di bawah:
library(data.table)
dat <- data.table(a = c(12, 15,16, rep(11:12, 2),15, rep(12,3), 17, 17, 18),
b = c("h",NA,letters[1:8],"e", "s", rep("q",2)))
> dat
a b
1: 12 h
2: 15 <NA>
3: 16 a
4: 11 b
5: 12 c
6: 11 d
7: 12 e
8: 15 f
9: 12 g
10: 12 h
11: 12 e
12: 17 s
13: 17 q
14: 18 q
Barisan ke 10 12 h
dan 11 12 e
berpendua.
Fungsi unique
di data.table akan memilih barisan-barisan yang unik sahaja. Sekiranya ingin menyusun mengikut abjad atau nombor, boleh tetapkan setkey()
. Fungi uniqueN()
memberikan jumlah barisan yang unik.
> setkey(dat, a)
> unique(dat)
a b
1: 11 b
2: 11 d
3: 12 h
4: 12 c
5: 12 e
6: 12 g
7: 15 <NA>
8: 15 f
9: 16 a
10: 17 s
11: 17 q
12: 18 q
> uniqueN(dat)
[1] 12
Data hanya tinggal 12 barisan sahaja sebab 12 h
di barisan 10 dan 12 e
di barisan 11 berpendua dan penduaanya dikeluarkan. Hanya barisan 3 dan 5 sahaja yang disimpan.
Untuk memilih barisan berdasarkan nilai unik di kolom tertentu, boleh menggunakan fungsi !duplicated
. Penggunaan unique
akan hanya memberikan nilai-nilai unik sebagai vektor. Akan tetapi penggunaan unique
cara data.table memberikan nilai yang tidak diingini kerana unique
tidak dipakai bila menggunakan pendekatan awam data.table iaitu DT[i,j,by]
. Ia hanya dipakai menggunakan expression cara unique()
.
> unique(dat$a)
[1] 11 12 15 16 17 18
> dat[!duplicated(a)]
a b
1: 11 b
2: 12 h
3: 15 <NA>
4: 16 a
5: 17 s
6: 18 q
> dat[unique(a)]
a b
1: 16 a
2: 17 s
3: NA <NA>
4: NA <NA>
5: NA <NA>
6: NA <NA>
Duplikasi
Untuk mencari duplikasi boleh menggunakan fungsi duplicated atau unique yang terdapat di base
. Kedua-duanya akan memberikan vektor. Fungsi duplicated akan memberikan TRUE FALSE
manakala unique memberikan data pendua.
Data.table juga menggunakan duplicated
atau unique
untuk mendapatkan duplikasi. Untuk mengenalpasti semua data yang ada penduanya bolehlah membuat kolom baru yang menetapkan barisan yang berpendua:
> dat[, fD := .N > 1, by = dat]
> dat
a b fD
1: 12 h TRUE
2: 15 <NA> FALSE
3: 16 a FALSE
4: 11 b FALSE
5: 12 c FALSE
6: 11 d FALSE
7: 12 e TRUE
8: 15 f FALSE
9: 12 g FALSE
10: 12 h TRUE
11: 12 e TRUE
12: 17 s FALSE
13: 17 q FALSE
14: 18 q FALSE
Untuk melihat kolom tertentu yang berpendua boleh dibuat seperti cara dibawah dimana kolom a dipilih dan semua yang berpendua di kolom tersebut dibariskan:
dat[duplicated(a)|duplicated(a, fromLast = TRUE), list(dd=sort(a))]
dd
1: 11
2: 11
3: 12
4: 12
5: 12
6: 12
7: 12
8: 12
9: 15
10: 15
11: 17
12: 17
Penggunaan fromLast=TRUE
ialah untuk mendapatkan barisan terakhir yang berpendua. Sekiranya hanya memakai fromLast=TRUE
barisan berpendua yang pertama tidak dikira.
Kekunci
Sekiranya ingin membuang semua yang berpendua berasaskan kekunci boleh dibuat seperti contoh dibawah. Contoh ini diambil dari StackOverflow. Cara ini hanya akan berfungsi selepas menetapkan kekunci di data.table dengan setkey
atau setkeyv
.
library(data.table)
myDT <- fread(
"id,fB,fC
1, b1,c1
2, b2,c2
3, b1,c1
4, b3,c3
5, b1,c1
")
## Tetapkan kekunci
setkeyv(myDT, c('fB', 'fC'))
Untuk dapatkan barisan berpendua berasaskan kekunci fB
dan fC
.
dups = duplicated(myDT, by = key(myDT));
myDT[, fD := dups | c(tail(dups, -1), FALSE)] #shift dups to 1 position ie. -1
## Cara lama dan agak lambat
myDT[, fD := .N > 1, by=key(myDT)]
## hasilnya
myDT
id fB fC fD
1: 1 b1 c1 TRUE
2: 3 b1 c1 TRUE
3: 5 b1 c1 TRUE
4: 2 b2 c2 FALSE
5: 4 b3 c3 FALSE
Indeks barisan
Kadang-kadang kita hanya ingin dapatkan indeks barisan yang berpendua tanpa perlu mendapatkan data. Cara ini memerlukan fungi which
. Contohnya:
> which(duplicated(dat))
[1] 10 11
Untuk menggunakan pendekatan cara data.table adalah seperti dibawah. Cara pertama dan kedua hanya memberikan index barisan terakhir atau pertama yang berpendua manakala cara ketiga memberikan semua barisan yang berpendua.
> dat[duplicated(dat), which=TRUE]
[1] 10 11
## Penggunaan fromLast
> dat[duplicated(dat, fromLast=TRUE), which=TRUE]
[1] 1 7
## Atau utk dapatkan semua barisan yang berpendua
> dat[duplicated(dat)|duplicated(dat, fromLast=TRUE), which=TRUE]
[1] 1 7 10 11