Kekadang nama untuk level yang diberikan di faktor bagi variabel jenis kumpulan (category) tidak bersesuaian dengan yang kita inginkan. Untuk menukarkan nama level tersebut kepada nama-nama yang lain, beberapa cara boleh dipakai. Sesetengah cara yang ditunjukkan di sini bergantung dengan jenis data yang dipakai iaitu data.frame atau data.table.

Data frame

Untuk menggunakan cara data.frame ialah seperti di bawah. Sekiranya df$bandar tidak ditukarkan ke factor, nilai levels yang ditetapkan iaitu nama bandar-bandar hanya akan diketahui bila melihat struktur data dengan str (structure) atau attr (attribute).

var <- LETTERS[1:5]
bandar <- c(1:4, 9) #sebagai numeric
df <- data.frame(var, bandar)

levels(df$bandar) <- c("Tawau", "Semporna", "Kunak", "Lahad Datu", "lain-lain")

## untuk lihat attribute variabel bandar yang ditetapkan seperti di atas
str(df)
attr(df$bandar, "levels")

Levels nilai iaitu nama bandar-bandar boleh dilihat dengan menukarkan variable bandar dari jenis nombor (numeric) ke faktor (factor).

## tukar 'bandar' ke factor
df2 <- df
df2$bandar <- factor(df2$bandar)
levels(df2$bandar) <- c("Tawau", "Semporna", "Kunak", "Lahad Datu", "lain-lain")

Sekiranya ingin menetapkan labels (nama bandar-badar di residensi Tawau) bagi levels tertentu contohnya nilai c(1,2,3,4,9), cara ini boleh dipakai:

nilai <- c("Tawau", "Semporna", "Kunak", "Lahad Datu", "lain-lain")
df$bandar <- factor(df$bandar, levels = c(1:4, 9), labels = nilai)

Cara ini untuk mengelakkan kesilapkan menamakan (labels) untuk levels.

Data table

Sekiranya ingin memakai cara data.table, data harus dikonvert ke data.table contohnya setDT(df) sebelum memakai fungsi yang ditunjukkan di sini. Cara yang dibuat untuk data frame juga boleh dipakai di data.table tetapi untuk mempercepatkan proses, cara data.table adalah seperti berikut:

library(data.table)
DT <- data.table(a=rep(0:1, 5), b=letters[1:10])

val <- c("no", "yes") # 0=No, 1=Yes

## Boleh pakai cara biasa
levels(DT$a) <- val

## Tukar melalui rujukan tanpa buat salinan
setattr(DT$a, "levels", c("no", "yes"))

Sekiranya ingin membuat salinan di kolom, boleh buat seperti untuk menukarkan kode

DT[.(a = 0:1, new = c("no", "yes")), on = "a"]

    a b new
 1: 0 a  no
 2: 0 c  no
 3: 0 e  no
 4: 0 g  no
 5: 0 i  no
 6: 1 b yes
 7: 1 d yes
 8: 1 f yes
 9: 1 h yes
10: 1 j yes

Cara lain ialah menggunakan fungsi setattr. Tetapi cara ini harus digunakan dengan berhati-hati kerana labels harus tepat dengan jumlah levels.

df3 <- df
setDT(df3)

## tukar bandar ke faktor
df3[, bandar := as.factor(bandar)]

## tetapkan levels untuk bandar
df3[, setattr(x = bandar,
              name = "levels",
              value = c("Tawau", "Semporna", "Kunak", "Lahad Datu", "lain-lain"))]
comments powered by Disqus