Angka hasil pengukuran disimpan sebagai vektor biasa, tetapi banyak data analisis berbentuk kategori, misalnya kelas A, B, dan C, jenis kelamin, atau tingkat pendidikan. R memperlakukan data semacam itu dengan tipe khusus bernama faktor, yaitu penyimpanan yang isinya dibatasi oleh sekumpulan tingkat (level) yang ditetapkan lebih dahulu. Topik ini membahas pembuatan faktor, pengendalian urutan tingkatnya, penyimpanan internalnya, serta penanganan tingkat yang tak terpakai dan nilai yang berada di luar tingkat.
Membuat faktor dan tingkatnya#
Fungsi factor() membentuk faktor dari vektor teks. Tingkat (level) adalah daftar nilai yang sah untuk faktor tersebut, dan secara bawaan tersusun alfabetis. Contoh berikut mengubah enam label kelas menjadi faktor.
kelas <- c("A", "B", "A", "C", "B", "A")
f <- factor(kelas)
f[1] A B A C B A
Levels: A B CCetakan faktor menampilkan isinya tanpa tanda kutip, lalu baris Levels berisi tingkat yang tersedia. Daftar tingkat dibaca dengan levels(), sedangkan frekuensi tiap tingkat dihitung dengan table(). Perhatikan bahwa tanda kutip hilang pada cetakan faktor karena isinya bukan lagi teks biasa, melainkan kode tingkat, sebagaimana dijelaskan pada bagian berikutnya.
levels(f)
table(f)[1] "A" "B" "C"
f
A B C
3 2 1Mengendalikan urutan tingkat#
Urutan alfabetis tidak selalu bermakna. Untuk ukuran Kecil, Sedang, dan Besar, urutan alfabetis justru menempatkan Besar lebih dahulu, padahal urutan yang diharapkan adalah dari yang terkecil.
ukuran <- factor(c("Sedang", "Besar", "Kecil", "Sedang"))
levels(ukuran)[1] "Besar" "Kecil" "Sedang"Argumen levels pada factor() menetapkan urutan tingkat secara eksplisit. Urutan ini digunakan R saat membandingkan, mengurutkan, dan menyusun sumbu grafik, sehingga pengendaliannya penting untuk data kategorikal yang tingkatnya bertahap. Faktor semacam ini juga dapat dinyatakan secara formal melalui argumen ordered = TRUE, yang menandai tingkatnya sebagai data ordinal.
ukuran <- factor(c("Sedang", "Besar", "Kecil", "Sedang"),
levels = c("Kecil", "Sedang", "Besar"))
levels(ukuran)
as.integer(ukuran)[1] "Kecil" "Sedang" "Besar"
[1] 2 3 1 2Keluaran as.integer() memperlihatkan kode penyimpanan tiap nilai, dan kodenya mengikuti urutan tingkat yang ditetapkan. Nilai Sedang disimpan sebagai 2, Besar sebagai 3, dan Kecil sebagai 1.
Penyimpanan internal dan kegunaannya#
Di belakang layar, faktor menyimpan kode bilangan bulat yang menunjuk daftar tingkatnya, bukan teks yang berulang-ulang.
as.integer(f)[1] 1 2 1 3 2 1Nilai A tersimpan sebagai 1, B sebagai 2, dan C sebagai 3, mengikuti urutan tingkatnya. Cara penyimpanan ini memberi tiga keuntungan praktis. Dari sisi memori, satu bilangan bulat jauh lebih ringkas daripada teks yang berulang pada data berukuran besar. Dari sisi pemodelan, fungsi seperti lm() membaca tingkat faktor dan membentuk variabel dummy (dummy variable) untuk tiap tingkat secara otomatis. Dari sisi grafik, paket seperti ggplot2 menempatkan kategori faktor pada sumbu diskrit dengan urutan tingkat yang sudah ditetapkan. Ketiganya menjadi alasan data kategorikal diperlakukan khusus dan tidak dibiarkan sebagai teks biasa.
Tingkat yang tak terpakai#
Faktor dapat dibuat dengan tingkat yang belum muncul dalam datanya, misalnya ketika data yang terkumpul hanya sebagian dari seluruh kategori yang mungkin. Tingkat semacam itu tetap tercatat, dan table() menampilkan hitungannya sebagai nol.
hobi <- factor(c("Membaca", "Olahraga", "Membaca"),
levels = c("Membaca", "Olahraga", "Musik", "Memasak"))
table(hobi)hobi
Membaca Olahraga Musik Memasak
2 1 0 0Tingkat yang memang tidak diperlukan lagi dapat dilepas dengan droplevels(), sehingga daftar tingkatnya kembali hanya memuat yang terpakai. Fungsi tersebut mengembalikan faktor baru tanpa mengubah objek aslinya, sehingga hobi tetap memuat empat tingkat bila diperiksa ulang.
droplevels(hobi)[1] Membaca Olahraga Membaca
Levels: Membaca OlahragaMemaksa nilai di luar tingkat#
Kebalikan tingkat tak terpakai adalah nilai yang tidak terdaftar di tingkat mana pun. Pada pembuatan faktor, nilai semacam itu langsung diubah menjadi NA tanpa peringatan apa pun.
factor("Menari", levels = c("Membaca", "Olahraga"))[1] <NA>
Levels: Membaca OlahragaPerilakunya berbeda pada penugasan ke elemen faktor yang sudah ada. Kasus ini memunculkan peringatan invalid factor level, dan elemen yang ditugaskan menjadi NA.
hobi[4] <- "Menari"
hobiWarning in `[<-.factor`(`*tmp*`, 4, value = "Menari") :
invalid factor level, NA generated
[1] Membaca Olahraga Membaca <NA>
Levels: Membaca Olahraga Musik MemasakKedua perilaku ini mengikuti logika yang sama, yaitu faktor tidak boleh berisi nilai di luar tingkatnya. Solusinya adalah menetapkan tingkat yang lengkap sejak awal, atau menyusun ulang faktornya dengan daftar tingkat yang lebih lengkap melalui factor().
Ringkasan#
factor()mengubah vektor teks menjadi faktor dengan tingkat yang tersusun alfabetis secara bawaan.- Argumen
levelsmenetapkan urutan tingkat, dan urutan itu digunakan saat membandingkan, mengurutkan, serta menyusun grafik. - Faktor menyimpan kode bilangan bulat yang menunjuk daftar tingkatnya, sehingga hemat memori dan dikenali oleh fungsi pemodelan maupun grafik.
- Tingkat yang tak terpakai tetap muncul dengan hitungan nol pada
table()dan dapat dilepas dengandroplevels(). - Nilai di luar tingkat menjadi NA, dengan peringatan pada penugasan dan tanpa peringatan pada pembuatan faktor.
Referensi#
- An Introduction to R — CRAN — bagian Ordered and unordered factors menjelaskan pembuatan faktor dan tingkatnya.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — membahas faktor beserta cara mengendalikan urutan tingkatnya.