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.

  • ๏ธ Struktur: Suatu faktor menyimpan kode bilangan bulat ditambah atribut level, sehingga setiap kategori divalidasi terhadap daftar tetap.
  • ๐Ÿงฉ Penciptaan: Fungsi factor() mengkonversi vektor karakter, dan fungsi class() mengkonfirmasi bahwa hasilnya telah berubah dari karakter menjadi faktor.
  • ๐Ÿ”˜ Nominal: Tanpa argumen level, R akan mengurutkan kategori-kategori tersebut dengan sendirinya, sehingga tidak ada peringkat yang tersirat antara warna atau jenis kelamin.
  • ๐Ÿ“Š Urut: Memberikan nilai ordered = TRUE dengan vektor levels yang eksplisit akan menetapkan peringkat dari terendah ke tertinggi.
  • ๐Ÿ”ข Kontinu: Kolom numerik dan integer tetap berurutan secara default, seperti yang ditunjukkan oleh class(mtcars$mpg).
  • โš ๏ธ Jebakan konversi: Metode as.numeric() pada sebuah faktor akan mengembalikan kode level, jadi bacalah label melalui levels() terlebih dahulu.
  • ๐Ÿง  Pemeliharaan: relevel() mengatur baseline model dan droplevels() menghapus kategori yang tertinggal oleh subset.

Faktor R pada Variabel Kategorikal dan Variabel 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.

Pertanyaan Umum Demo Slot

Jika argumen levels tidak diberikan, fungsi factor() akan memanggil unique() dan mengurutkan nilai-nilai tersebut dalam urutan menaik. Pengurutan tersebut bergantung pada lokal yang aktif, sehingga tidak selalu berupa ASCII biasa. Berikan argumen levels secara eksplisit setiap kali urutan tersebut memiliki arti.

table(f) mengembalikan jumlah bernama untuk setiap level, dan prop.table(table(f)) mengubah jumlah tersebut menjadi proporsi. Keduanya mempertahankan level kosong agar tetap terlihat, sehingga berguna untuk menemukan kategori yang menghilang setelah melakukan penyaringan. bingkai data.

Fungsi factor() mencocokkan setiap elemen dengan level yang Anda berikan, dan nilai apa pun yang tidak cocok akan menjadi NA daripada menimbulkan kesalahan. Periksa setdiff(unique(x), your_levels) sebelum mengkonversi, dan perhatikan spasi yang tidak perlu atau perbedaan kapitalisasi dalam data sumber.

Fungsi `cut()` membagi vektor numerik pada titik pemisah yang Anda berikan dan mengembalikan faktor. Berikan label untuk nama band yang mudah dibaca dan `ordered_result = TRUE` jika band tersebut berperingkat. `findInterval()` adalah alternatif yang lebih cepat jika hanya indeks bin yang dibutuhkan.

Sejak R 4.0.0, pengaturan default bawaan pabrik untuk data.frame() dan read.csv() adalah stringsAsFactors = FALSE, sehingga kolom teks tetap berupa karakter. Skrip lama yang mengandalkan konversi otomatis sekarang harus memanggil factor() secara eksplisit pada kolom yang dimodelkannya.

Less dibandingkan sebelumnya. Catatan referensi dasar R menyatakan bahwa string yang identik sekarang berbagi penyimpanan, sehingga kesenjangannya kecil dalam sebagian besar kasus. Faktor-faktor tersebut masih bermanfaat dengan memvalidasi kategori dan dengan memperbaiki urutan level yang digunakan dalam model dan plot.

Sebagian besar fungsi pemodelan menerima faktor secara langsung dan membangun kontras dummy secara otomatis, sementara banyak Mesin belajar Paket-paket tersebut mengharapkan matriks numerik. `model.matrix()` atau pengkodean one-hot menjembatani kesenjangan tersebut, dan faktor terurut dapat mempertahankan peringkatnya.

Ya. Kopilot GitHub Berfungsi di RStudio 2023.09.0 dan versi yang lebih baru, serta menyarankan penyelesaian berdasarkan komentar dan kode dalam file yang terbuka. Anggap urutan level dan penanganan NA sebagai saran untuk diverifikasi, bukan sebagai fakta.

Ringkaslah postingan ini dengan: