Ketika saya mengonversi faktor menjadi numerik atau bilangan bulat, saya mendapatkan kode level yang mendasarinya, bukan nilai sebagai angka.
f <- factor(sample(runif(5), 20, replace = TRUE))
## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041
## [4] 0.0284090070053935 0.363644931698218 0.363644931698218
## [7] 0.179684827337041 0.249704354675487 0.249704354675487
## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935
## [13] 0.179684827337041 0.0248644019011408 0.179684827337041
## [16] 0.363644931698218 0.249704354675487 0.363644931698218
## [19] 0.179684827337041 0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218
as.numeric(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
as.integer(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
Saya harus menggunakan paste
untuk mendapatkan nilai-nilai nyata:
as.numeric(paste(f))
## [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
## [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901
Apakah ada cara yang lebih baik untuk mengubah faktor menjadi angka?
attributes(f)
), jadi saya tidak berpikir ada yang salah dengan ituas.numeric(paste(f))
. Mungkin akan lebih baik untuk berpikir mengapa (dalam konteks tertentu) Anda mendapatkan faktor di tempat pertama, dan mencoba untuk menghentikannya. Misalnya, apakahdec
argumen dalamread.table
set dengan benar?df %>% convert(num(column))
. Atau jika Anda memiliki vektor faktor yang dapat Anda gunakanas_reliable_num(factor_vector)
Jawaban:
Lihat bagian Peringatan
?factor
:FAQ tentang R memiliki saran serupa .
Mengapa
as.numeric(levels(f))[f]
lebih efisien daripadaas.numeric(as.character(f))
?as.numeric(as.character(f))
efektifas.numeric(levels(f)[f])
, sehingga Anda melakukan konversi ke numerik padalength(x)
nilai, bukan padanlevels(x)
nilai. Perbedaan kecepatan akan paling jelas untuk vektor panjang dengan beberapa level. Jika sebagian besar nilai unik, tidak akan ada banyak perbedaan dalam kecepatan. Bagaimanapun Anda melakukan konversi, operasi ini tidak mungkin menjadi hambatan dalam kode Anda, jadi jangan terlalu khawatir tentang hal itu.Beberapa pengaturan waktu
sumber
R memiliki sejumlah fungsi kenyamanan (tanpa dokumen) untuk mengonversi faktor:
as.character.factor
as.data.frame.factor
as.Date.factor
as.list.factor
as.vector.factor
Tapi yang menjengkelkan, tidak ada yang menangani faktor -> konversi numerik . Sebagai perpanjangan dari jawaban Joshua Ulrich, saya akan menyarankan untuk mengatasi kelalaian ini dengan definisi fungsi idiomatik Anda sendiri:
Anda dapat menyimpan di awal skrip Anda, atau bahkan lebih baik di
.Rprofile
file Anda .sumber
as.integer(factor)
mengembalikan kode integer yang mendasarinya (seperti yang ditunjukkan pada bagian contoh?factor
). Mungkin boleh saja mendefinisikan fungsi ini di lingkungan global Anda, tetapi Anda mungkin menimbulkan masalah jika Anda benar-benar mendaftarkannya sebagai metode S3.factor->numeric
konversi banyak sebelum menyadari bahwa itu sebenarnya kelemahan dari R: beberapa fungsi kenyamanan harus tersedia ... Menyebutnyaas.numeric.factor
masuk akal bagi saya, tapi YMMV.v=NA;as.numeric.factor(v)
atauv='something';as.numeric.factor(v)
, maka seharusnya, kalau tidak, Anda memiliki hal aneh terjadi di suatu tempat.Cara paling mudah adalah menggunakan
unfactor
fungsi dari paket varhandleContoh ini bisa menjadi awal yang cepat:
sumber
unfactor
bertobat fungsi untuk tipe data karakter pertama dan kemudian bertobat kembali ke numerik. Ketikunfactor
di konsol dan Anda dapat melihatnya di tengah fungsi. Karena itu tidak benar-benar memberikan solusi yang lebih baik daripada apa yang sudah dimiliki penanya.unfactor
Fungsi mengurus hal-hal yang tidak dapat dikonversi ke numerik. Lihat contoh dihelp("unfactor")
library("varhandle")
) terlebih dahulu (seperti yang saya sebutkan di baris pertama dari jawaban saya !!)as.numeric()
danas.character()
dalam urutan yang salah;) Apa yang dilakukan oleh kode Anda adalah mengubah indeks level faktor menjadi matriks karakter, jadi apa yang akan Anda miliki di dan adalah vektor karakter yang berisi beberapa angka yang pernah ditetapkan ke tingkat tertentu dari faktor Anda. Fungsi-fungsi dalam paket itu ada untuk mencegah kebingungan iniCatatan: jawaban khusus ini bukan untuk mengonversi faktor bernilai numerik menjadi angka, melainkan untuk mengonversi faktor kategori ke angka level yang sesuai.
Setiap jawaban dalam posting ini gagal menghasilkan hasil untuk saya, NA semakin dihasilkan.
Apa yang berhasil untuk saya adalah ini -
sumber
y<-factor(c("5","15","20","2")); unclass(y) %>% as.numeric
Ini mengembalikan 4,1,3,2, bukan 5,15,20,2. Ini sepertinya informasi yang salah.as.numeric(y)
seharusnya bekerja dengan baik, tidak perluunclass()
. Tetapi sekali lagi, bukan itu pertanyaannya. Jawaban ini tidak sesuai di sini.Mungkin hanya dalam kasus ketika label faktor cocok dengan nilai asli. Saya akan menjelaskannya dengan sebuah contoh.
Anggap datanya vektor
x
:Sekarang saya akan membuat faktor dengan empat label:
1)
x
dengan tipe ganda,f
dengan tipe integer. Ini adalah kehilangan informasi pertama yang tak terhindarkan. Faktor selalu disimpan sebagai bilangan bulat.2) Tidak mungkin kembali ke nilai semula (10, 20, 30, 40) hanya
f
tersedia. Kita dapat melihat bahwaf
hanya memegang nilai integer 1, 2, 3, 4 dan dua atribut - daftar label ("A", "B", "C", "D") dan atribut kelas "faktor". Tidak ada lagi.Untuk mengembalikan kembali ke nilai asli kita harus mengetahui nilai level yang digunakan dalam menciptakan faktor. Dalam hal ini
c(10, 20, 30, 40)
. Jika kita mengetahui level aslinya (dalam urutan yang benar), kita dapat kembali ke nilai semula.Dan ini hanya akan berfungsi jika label telah ditentukan untuk semua nilai yang mungkin dalam data asli.
Jadi, jika Anda membutuhkan nilai-nilai asli, Anda harus menyimpannya. Kalau tidak, ada kemungkinan besar tidak akan mungkin untuk kembali kepada mereka hanya dari faktor.
sumber
Anda dapat menggunakan
hablar::convert
jika Anda memiliki bingkai data. Sintaksnya mudah:Contoh df
Larutan
Memberi anda:
Atau jika Anda ingin satu kolom menjadi bilangan bulat dan satu angka:
menghasilkan:
sumber
Sepertinya solusinya sebagai.numerik (level (f)) [f] tidak lagi berfungsi dengan R 4.0.
Solusi alternatif:
sumber
Dari banyak jawaban yang bisa saya baca, satu-satunya cara yang diberikan adalah memperluas jumlah variabel sesuai dengan jumlah faktor. Jika Anda memiliki variabel "pet" dengan level "dog" dan "cat", Anda akan berakhir dengan pet_dog dan pet_cat.
Dalam kasus saya, saya ingin tetap dengan jumlah variabel yang sama, dengan hanya menerjemahkan variabel faktor ke variabel numerik, dengan cara yang dapat diterapkan ke banyak variabel dengan banyak level, sehingga cat = 1 dan dog = 0 misalnya.
Silakan temukan solusi yang sesuai di bawah ini:
sumber
terlambat ke permainan, secara tidak sengaja, saya menemukan
trimws()
dapat mengkonversifactor(3:5)
kec("3","4","5")
. Maka Anda bisa meneleponas.numeric()
. Itu adalah:sumber
trimws
lebih dari yangas.character
dijelaskan dalam jawaban yang diterima? Sepertinya saya kecuali Anda benar-benar memiliki spasi putih yang perlu Anda hapus,trimws
hanya akan melakukan banyak pekerjaan ekspresi reguler yang tidak perlu untuk mengembalikan hasil yang sama.