Faktor dalam R: Variabel Kategorikal & Variabel Kontinu
โก Ringkasan Cerdas
Dalam R, fungsi `factor` menyimpan data kategorikal sebagai vektor kode bilangan bulat yang dipasangkan dengan serangkaian level, yang merupakan cara bahasa tersebut memisahkan kelompok kategori terbatas dari pengukuran kontinu.

Apa itu Faktor dalam R?
Faktorkan dalam R Variabel `factor` digunakan untuk mengkategorikan dan menyimpan data, dengan jumlah nilai berbeda yang terbatas. Variabel ini menyimpan data sebagai vektor nilai integer. Dalam R, `factor` juga dikenal sebagai variabel kategorikal yang menyimpan nilai data berupa string dan integer sebagai level. `factor` sebagian besar digunakan dalam pemodelan statistik dan analisis data eksploratif dengan R.
Secara internal, sebuah faktor terdiri dari dua objek yang bergerak bersama: sebuah vektor bilangan bulat berisi kode, dan sebuah atribut karakter bernama... adalah ide yang bagusSetiap kode merupakan posisi dalam vektor level tersebut, itulah sebabnya mencetak faktor akan menampilkan kata-kata sementara unclass() menampilkan angka.
Dalam sebuah dataset, kita dapat membedakan dua jenis variabel: kategorikal ke kontinu.
- Dalam statistik deskriptif untuk variabel kategori dalam R, nilainya terbatas dan biasanya didasarkan pada kelompok terbatas tertentu. Misalnya, variabel kategori dalam R dapat berupa negara, tahun, jenis kelamin, pekerjaan.
- Namun, variabel kontinu dapat mengambil nilai apa pun, dari bilangan bulat hingga desimal. Misalnya, kita dapat memiliki pendapatan, harga saham, dan lain sebagainya.
Perbedaan itu perlu dijaga, karena R secara diam-diam memilih pengaturan default yang berbeda untuk masing-masing. Kolom numerik diringkas dengan nilai rata-rata dan median, sedangkan faktor diringkas dengan jumlah per level. Oleh karena itu, menyimpan kategori sebagai teks atau sebagai angka akan mengubah analisis yang Anda dapatkan. Rangkaian mode penyimpanan yang lebih luas dibahas dalam panduan untuk Tipe data dan operator R.
Variabel Kategoris
Variabel kategori di R disimpan ke dalam sebuah faktor. Mari kita periksa kode di bawah ini untuk mengkonversi variabel karakter menjadi variabel faktor di R. Banyak rutinitas pemodelan dan pembelajaran mesin tidak dapat mengonsumsi teks mentah, sehingga kategori harus dikodekan sebagai level atau sebagai angka sebelum model dipasang.
Sintaksis
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
Dokumen referensi dasar R menyebutkan dua argumen tambahan yang dihilangkan oleh bentuk singkat di atas: mengecualikan, yang menghapus nilai sebelum himpunan level dibangun, dan nmax, batas atas pada jumlah level yang mempercepat konversi vektor yang sangat besar.
Argumen:
- x: Sebuah vektor data kategorikal di R. Harus berupa string atau bilangan bulat, bukan desimal.
- adalah ide yang bagus: Sebuah vektor nilai-nilai yang mungkin diambil oleh x. Argumen ini opsional. Nilai default adalah daftar unik item dari vektor x, diurutkan dalam urutan menaik.
- label: Tambahkan label pada data kategorikal x di R. Misalnya, 1 dapat diberi label laki-laki sedangkan 0 diberi label perempuan.
- mengecualikan: Sebuah vektor nilai yang akan dihilangkan saat himpunan level terbentuk. Nilai yang dikecualikan akan menjadi NA dalam hasilnya.
- dipesan: Sebuah flag logis yang menentukan apakah level-level tersebut harus dianggap berurutan, sesuai urutan yang diberikan.
- nmax: Batas atas opsional pada jumlah level, berguna untuk vektor panjang.
Contoh:
Mari kita ubah vektor karakter menjadi faktor dan konfirmasikan perubahannya dengan class().
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
Keluaran:
## [1] "character" ## [1] "factor"
Kelas tersebut beralih dari karakter ke faktor, dan tidak ada yang berubah pada nilai yang dicetak. Penting untuk mengubah sebuah string menjadi variabel faktor di R sebelum tugas pembelajaran mesin, karena pada titik itulah kategori menjadi himpunan tetap dan tervalidasi.
Variabel kategori dalam R dapat dibagi menjadi variabel kategori nominal ke variabel kategoris ordinal.
Variabel Kategorikal Nominal
Variabel kategorikal nominal memiliki beberapa nilai tetapi urutannya tidak penting. Misalnya, laki-laki atau perempuan. Variabel kategorikal nominal di R tidak memiliki urutan apa pun.
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
Keluaran:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Dari factor_color, kita tidak dapat mengetahui urutannya. Daftar level hanya diurutkan secara alfabetis karena tidak ada argumen levels yang diberikan, sehingga R mengurutkan nilai uniknya sendiri. Pengurutan tersebut mengikuti lokal aktif, bukan ASCII biasa, yang merupakan salah satu alasan untuk menyatakan level secara eksplisit setiap kali urutannya penting.
Variabel Kategori Ordinal
Variabel kategorikal ordinal memang memiliki urutan alami. Peringkat tersebut berasal dari urutan vektor yang diteruskan ke adalah ide yang bagus argumen, dan ordered = TRUE memberi tahu R untuk memperlakukan urutan tersebut sebagai peringkat, bukan sebagai daftar biasa. Mengatur ordered = FALSE tidak membalikkan peringkat; itu hanya menghasilkan faktor tak berurutan biasa. Untuk memberi peringkat dari tertinggi ke terendah, balikkan vektor levels itu sendiri.
Contoh:
Kita dapat menggunakan ringkasan untuk menghitung nilai setiap variabel faktor di R.
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
Keluaran:
## [1] evening morning afternoon midday
midnight evening
Konsol mencetak nilai terlebih dahulu dan peringkat di bawahnya. Blok berikutnya dibuka dengan baris Levels tersebut, yang masih dikomentari, sehingga peringkat tetap terlihat sementara panggilan summary() ditambahkan ke kode sebelumnya.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Keluaran:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R mengurutkan level dari 'pagi' hingga 'tengah malam' seperti yang ditentukan dalam argumen levels. Karena faktor tersebut diurutkan, operator perbandingan seperti < dan > juga berfungsi padanya, yang tidak berlaku pada faktor warna nominal di atas.
Variabel Kontinu
Variabel kelas kontinu adalah nilai default di R. Variabel ini disimpan sebagai nilai numerik atau integer. Kita dapat melihatnya dari dataset di bawah ini. mtcars adalah dataset bawaan. Dataset ini mengumpulkan informasi tentang berbagai jenis mobil. Kita dapat mengimpornya dengan menggunakan mtcars dan memeriksa kelas variabel mpg, mile per gallon. Variabel ini mengembalikan nilai numerik, yang menunjukkan variabel kontinu.
dataset <- mtcars class(dataset$mpg)
Keluaran
## [1] "numeric"
Tidak setiap kolom numerik benar-benar kontinu. Dalam dataset yang sama, cyl hanya berisi 4, 6, dan 8, dan am hanya berisi 0 dan 1, jadi keduanya adalah kategori yang kebetulan disimpan sebagai angka. Mengonversinya dengan factor() sebelum pemodelan mencegah R memperlakukan celah antara 4 dan 6 silinder sebagai kuantitas terukur. Langkah sebaliknya, membagi kolom kontinu menjadi beberapa bagian, ditangani oleh cut().
Tingkat Faktor dan Label di R
Atribut level adalah bagian dari faktor yang akan paling banyak Anda sesuaikan, karena atribut ini mengontrol apa yang dicetak dan apa yang dianggap model sebagai garis dasar. Empat fungsi pembantu R dasar mencakup hampir setiap kasus.
| fungsi | Apa yang dilakukannya | Penggunaan khas |
|---|---|---|
| tingkat(f) | Membaca atau mengganti nama level | Mengubah singkatan menjadi label yang mudah dibaca. |
| tingkatan(f) | Mengembalikan jumlah level | Memeriksa apakah suatu kategori tidak meledak setelah penggabungan. |
| kembali level(f, ref) | Pindah satu tingkat ke depan | Memilih garis dasar untuk regresi |
| tingkat penurunan(f) | Menghapus level dengan nol pengamatan | Membersihkan setelah melakukan subsetting atau penyaringan. |
Blok di bawah ini menerapkan keempat faktor tersebut pada warna dan jenis kelamin yang telah dibuat sebelumnya.
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
Ada dua detail yang perlu diingat. Penugasan ke levels() mengubah nama berdasarkan posisi, sehingga vektor yang tidak cocok secara diam-diam memberi label ulang kategori yang salah. Dan subset mempertahankan setiap level asli hingga droplevels() dipanggil, itulah sebabnya filtered bingkai data Masih bisa menampilkan batang kosong. The label Argumennya berbeda lagi: argumen tersebut menyebutkan level pada saat pembuatan, dan label yang diduplikasi menggabungkan beberapa nilai input menjadi satu level.
Cara Mengonversi Faktor ke Angka atau Karakter di R
Ini adalah bug faktor yang paling umum di R. Karena faktor menyimpan kode bilangan bulat, memanggil `as.numeric()` padanya akan mengembalikan kode tersebut, bukan nilai yang Anda lihat di layar. Faktor tahun 2021 hingga 2023 akan mengembalikan nilai 1, 2, dan 3.
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
Dokumentasi dasar R merekomendasikan as.numeric(levels(f))[f] sebagai cara yang benar dan sedikit lebih cepat, dengan as.numeric(as.character(f)) sebagai padanan yang lebih mudah dibaca. Keduanya membaca label terlebih dahulu dan melakukan konversi setelahnya.
- Faktor terhadap karakter: as.character(f) mengembalikan label sebagai teks biasa.
- Faktorkan ke kode bilangan bulat: as.integer(f) atau unclass(f) ketika kode tersebut adalah yang sebenarnya Anda inginkan.
- Karakter untuk faktor: faktor(x) atau pintasan yang lebih cepat yaitu as.faktor(x).
- Angka untuk memfaktorkan: factor(x) untuk kode diskrit, cut(x, breaks) untuk nilai kontinu yang membutuhkan pengelompokan.
Satu pengamanan berlaku untuk semuanya. Jika nilai dalam x tidak muncul dalam vektor level, factor() mengatur elemen tersebut menjadi NA alih-alih menimbulkan kesalahan, sehingga spasi yang tidak sengaja atau perbedaan kapitalisasi dapat secara diam-diam menghapus baris. Membandingkan nilai unik sebelum dan sesudah konversi, atau mengurutkan data frame Pada kolom baru tersebut, masalahnya terungkap dengan cepat.
Faktor vs Karakter vs Numerik di R: Kapan Menggunakan Masing-masing
Memilih mode penyimpanan sejak awal akan sangat menghemat waktu debugging di kemudian hari. Tabel tersebut membandingkan tiga mode yang dapat digunakan oleh kolom teks atau kode.
| Milik | Faktor | Karakter | Numeric |
|---|---|---|---|
| Disimpan sebagai | Kode bilangan bulat ditambah atribut level. | String | Doubles atau bilangan bulat |
| Kumpulan nilai tetap | Ya, ditentukan berdasarkan level. | Tidak | Tidak |
| Pesanan tampilan khusus | Ya, melalui beberapa tingkatan. | Hanya berdasarkan abjad | Hanya angka |
| Hitung | Tidak diizinkan | Tidak diizinkan | Diizinkan |
| Kontras model | Dibangun secara otomatis | Dipaksa terlebih dahulu | Diperlakukan sebagai sebuah pengukuran |
Menggunakan faktor Saat nilai-nilai berasal dari daftar tertutup yang diketahui, saat tampilan atau urutan peringkat penting, atau saat kolom tersebut menjadi masukan untuk model atau legenda plot. Gunakan karakter untuk teks bebas, pengidentifikasi, dan apa pun yang akan Anda uraikan atau gabungkan, seperti nama, catatan, dan kode yang terus datang dengan nilai baru. Gunakan numerik hanya jika jarak antara dua nilai tersebut bermakna.
Blok di bawah ini menunjukkan cara tercepat untuk memeriksa apa yang sebenarnya Anda miliki.
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
Dua kebiasaan menjaga agar pilihan tetap jujur. Jalankan sapply(df, class) setelah setiap impor, karena satu karakter yang menyimpang dalam kolom numerik mengubah seluruh kolom menjadi teks. Dan konversikan ke faktor selambat mungkin, setelah data dibersihkan dan digabungkan, sehingga dplyr Penggabungan dan penyaringan masih membandingkan string biasa, bukan himpunan level yang tidak cocok.
