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
comments powered by Disqus