Salah satu tipe data dasar di R adalah faktor. Dalam pengalaman saya, faktor-faktor pada dasarnya menyakitkan dan saya tidak pernah menggunakannya. Saya selalu mengonversi ke karakter. Saya merasa aneh seperti saya melewatkan sesuatu.
Adakah beberapa contoh penting dari fungsi yang menggunakan faktor sebagai variabel pengelompokan di mana tipe data faktor menjadi diperlukan? Apakah ada keadaan khusus ketika saya harus menggunakan faktor?
r
language-design
internals
r-factor
JD Long
sumber
sumber
Jawaban:
Anda harus menggunakan faktor. Ya mereka bisa menyebalkan, tetapi teori saya adalah bahwa 90% mengapa mereka menyebalkan adalah karena dalam
read.table
danread.csv
, argumenstringsAsFactors = TRUE
secara default (dan sebagian besar pengguna melewatkan kehalusan ini). Saya katakan mereka berguna karena paket model fitting seperti faktor penggunaan lme4 dan faktor yang dipesan untuk menyesuaikan model secara berbeda dan menentukan jenis kontras yang akan digunakan. Dan paket grafik juga menggunakannya untuk mengelompokkan.ggplot
dan sebagian besar fungsi pemasangan model memaksa vektor karakter menjadi faktor, sehingga hasilnya sama. Namun, Anda berakhir dengan peringatan di kode Anda:Satu hal yang rumit adalah keseluruhannya
drop=TRUE
. Dalam vektor, ini berfungsi dengan baik untuk menghilangkan tingkat faktor yang tidak ada dalam data. Sebagai contoh:Namun , dengan
data.frame
s, perilaku[.data.frame()
berbeda: lihat email ini atau?"[.data.frame"
. Penggunaandrop=TRUE
padadata.frame
s tidak berfungsi seperti yang Anda bayangkan:Untungnya Anda dapat menghilangkan faktor dengan mudah dengan
droplevels()
menurunkan tingkat faktor yang tidak digunakan untuk satu faktor atau untuk setiap faktor dalam adata.frame
(sejak R 2.12):Ini adalah cara menjaga level yang Anda pilih agar tidak menjadi
ggplot
legenda.Secara internal,
factor
s adalah bilangan bulat dengan vektor karakter tingkat atribut (lihatattributes(iris$Species)
danclass(attributes(iris$Species)$levels)
), yang bersih. Jika Anda harus mengubah nama level (dan Anda menggunakan string karakter), ini akan menjadi operasi yang jauh kurang efisien. Dan saya banyak mengubah nama level, terutama untukggplot
legenda. Jika Anda memalsukan faktor dengan vektor karakter, ada risiko bahwa Anda hanya akan mengubah satu elemen, dan secara tidak sengaja membuat level baru yang terpisah.sumber
stringsAsFactors
bukanlah sebuah fungsi.faktor urutan luar biasa, jika saya kebetulan menyukai jeruk dan membenci apel tetapi tidak keberatan anggur, saya tidak perlu mengelola beberapa indeks aneh untuk mengatakannya:
sumber
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
dilakukannya? Saya akan menebak bahwa itu memesan ini dalam bingkai data, tetapi setelah saya menjalankan baris itu dan mencetak bingkai data, tidak ada yang berubah. Apakah itu hanya memberlakukan pesanan internal meskipun pesanan cetak tidak berubah?A
factor
paling mirip dengan tipe enumerasi dalam bahasa lain. Penggunaan yang tepat adalah untuk variabel yang hanya dapat mengambil satu dari kumpulan nilai yang ditentukan. Dalam kasus ini, tidak setiap kemungkinan nilai yang diizinkan dapat ada dalam kumpulan data tertentu dan level "kosong" secara akurat mencerminkannya.Perhatikan beberapa contoh. Untuk beberapa data yang dikumpulkan di seluruh Amerika Serikat, negara bagian harus dicatat sebagai faktor. Dalam kasus ini, fakta bahwa tidak ada kasus yang dikumpulkan dari negara bagian tertentu adalah relevan. Mungkin ada data dari negara bagian itu, tetapi terjadi (untuk alasan apa pun, yang mungkin menjadi alasan yang menarik) tidak ada. Jika kampung halaman dikumpulkan, itu tidak akan menjadi faktor. Tidak ada kumpulan kemungkinan asal yang telah ditentukan sebelumnya. Jika data dikumpulkan dari tiga kota dan bukan secara nasional, kota tersebut akan menjadi faktor: ada tiga pilihan yang diberikan di awal dan jika tidak ada kasus / data yang relevan ditemukan di salah satu dari tiga kota tersebut, itu relevan.
Aspek lain dari
factor
s, seperti menyediakan cara untuk memberikan urutan arbitrer ke sekumpulan string, merupakan karakteristik sekunder yang berguna darifactor
s, tetapi bukan alasan keberadaannya.sumber
Faktor-faktor luar biasa ketika seseorang melakukan analisis statistik dan benar-benar menjelajahi data. Namun, sebelum itu ketika seseorang membaca, membersihkan, memecahkan masalah, menggabungkan dan umumnya memanipulasi data, faktor-faktornya sangat merepotkan. Baru-baru ini, seperti dalam beberapa tahun terakhir, banyak fungsi telah ditingkatkan untuk menangani faktor-faktor tersebut dengan lebih baik. Misalnya, rbind bermain bagus dengan mereka. Saya masih merasa sangat merepotkan untuk memiliki level kosong yang tersisa setelah fungsi subset.
Saya tahu bahwa sangat mudah untuk mengodekan ulang level faktor dan mengatur ulang label dan ada juga cara yang bagus untuk menyusun ulang level. Otak saya tidak dapat mengingatnya dan saya harus mempelajarinya kembali setiap kali saya menggunakannya. Pengodean ulang seharusnya jauh lebih mudah daripada sebelumnya.
Fungsi string R cukup mudah dan logis untuk digunakan. Jadi saat memanipulasi saya biasanya lebih memilih karakter daripada faktor.
sumber
droplevels()
. Dan itu tidak mengatur ulang faktor secara default.Judul yang sangat tajam!
Saya percaya banyak fungsi estimasi memungkinkan Anda menggunakan faktor untuk dengan mudah mendefinisikan variabel dummy ... tapi saya tidak menggunakannya untuk itu.
Saya menggunakannya ketika saya memiliki vektor karakter yang sangat besar dengan sedikit pengamatan unik. Ini dapat mengurangi konsumsi memori, terutama jika string dalam vektor karakter lebih panjang.
PS - Saya bercanda tentang judulnya. Saya melihat tweet Anda. ;-)
sumber
?factor
itu R-2.6.0 dan dikatakan, "Nilai integer disimpan dalam 4 byte sedangkan setiap referensi ke string karakter membutuhkan penunjuk sebesar 4 atau 8 byte." Apakah Anda akan menghemat ruang untuk mengonversi faktor jika string karakter membutuhkan 8 byte?N=100000
saya mendapat 391,5 Kb vs 391,8 Kb. Jadi faktor membutuhkan lebih banyak memori.Faktor-faktornya adalah mesin badging "casing unik" yang luar biasa. Saya telah membuat ulang ini berkali-kali, dan meskipun kadang-kadang ada beberapa kerutan, mereka sangat kuat.
Jika ada cara yang lebih baik untuk melakukan tugas ini, saya ingin melihatnya, saya tidak melihat kemampuan
factor
dibahas ini.sumber
tapply (dan agregat ) bergantung pada faktor-faktor. Rasio informasi-ke-usaha dari fungsi-fungsi ini sangat tinggi.
Misalnya, dalam satu baris kode (panggilan untuk mengetuk di bawah) Anda bisa mendapatkan harga rata-rata berlian dengan Potong dan Warna:
sumber