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"))]