Saya memiliki bingkai data yang mengandung a factor
. Saat saya membuat subset dari subset
kerangka data ini menggunakan atau fungsi pengindeksan lainnya, bingkai data baru dibuat. Namun, factor
variabel mempertahankan semua level aslinya, bahkan ketika / jika mereka tidak ada dalam kerangka data baru.
Ini menyebabkan masalah ketika melakukan faceted plotting atau menggunakan fungsi yang bergantung pada tingkat faktor.
Apa cara paling ringkas untuk menghapus level dari faktor dalam kerangka data baru?
Ini sebuah contoh:
df <- data.frame(letters=letters[1:5],
numbers=seq(1:5))
levels(df$letters)
## [1] "a" "b" "c" "d" "e"
subdf <- subset(df, numbers <= 3)
## letters numbers
## 1 a 1
## 2 b 2
## 3 c 3
# all levels are still there!
levels(subdf$letters)
## [1] "a" "b" "c" "d" "e"
mydf <- droplevels(mydf)
solusi yang disarankan oleh Roman Luštrik dan Tommy O'Dell di bawah ini lebih disukai.Sejak R versi 2.12, ada
droplevels()
fungsi.sumber
factor()
adalah tidak perlu memodifikasi kerangka data asli atau membuat kerangka data persisten baru. Saya bisa membungkusdroplevels
dataframe yang sudah di-subsettens dan menggunakannya sebagai argumen data ke fungsi kisi, dan grup akan ditangani dengan benar.Jika Anda tidak menginginkan perilaku ini, jangan gunakan faktor, gunakan vektor karakter. Saya pikir ini lebih masuk akal daripada memperbaiki keadaan setelahnya. Coba yang berikut ini sebelum memuat data Anda dengan
read.table
atauread.csv
:Kerugiannya adalah Anda terbatas pada pemesanan berdasarkan abjad. (menyusun ulang adalah teman Anda untuk plot)
sumber
Ini adalah masalah yang diketahui, dan satu kemungkinan obat disediakan oleh
drop.levels()
dalam paket gdata di mana contoh Anda menjadiAda juga
dropUnusedLevels
fungsi dalam paket Hmisc . Namun, ini hanya berfungsi dengan mengubah operator subset[
dan tidak berlaku di sini.Sebagai akibat wajar, pendekatan langsung berdasarkan per kolom adalah sederhana
as.factor(as.character(data))
:sumber
reorder
parameter daridrop.levels
fungsi bernilai menyebutkan: jika Anda harus menjaga urutan asli dari faktor Anda, menggunakannya denganFALSE
nilai.Cara lain melakukan hal yang sama tetapi dengan
dplyr
Edit:
Juga Berhasil! Berkat agenis
sumber
Demi kelengkapan, sekarang ada juga
fct_drop
diforcats
paket http://forcats.tidyverse.org/reference/fct_drop.html .Ini berbeda dari
droplevels
cara berurusanNA
:sumber
Inilah cara lain, yang saya percaya setara dengan
factor(..)
pendekatan:sumber
`[.factor`
metode yang memilikidrop
argumen dan Anda telah memposting ini pada tahun 2009 ...Ini menjengkelkan. Inilah yang biasanya saya lakukan, untuk menghindari memuat paket lain:
yang membuat Anda:
Perhatikan bahwa level baru akan menggantikan apa pun yang menempati indeks mereka di level lama (subdf $ letters), jadi kira-kira seperti:
tidak akan bekerja
Ini jelas tidak ideal ketika Anda memiliki banyak level, tetapi untuk beberapa level, ini cepat dan mudah.
sumber
Melihat kode
droplevels
metode dalam sumber R Anda dapat melihatnya membungkusfactor
berfungsi. Itu berarti Anda pada dasarnya dapat membuat ulang kolom denganfactor
fungsi.Di bawah data.tabel cara untuk menjatuhkan level dari semua kolom faktor.
sumber
data.table
jalannya akan sepertifor (j in names(DT)[sapply(DT, is.factor)]) set(DT, j = j, value = factor(DT[[j]]))
[.data.table
hanya memanggil sekalidi sini adalah cara untuk melakukan itu
sumber
Saya menulis fungsi utilitas untuk melakukan ini. Sekarang saya tahu tentang drop.levels gdata, itu terlihat sangat mirip. Inilah mereka (dari sini ):
sumber
Utas yang sangat menarik, saya terutama menyukai ide untuk hanya faktor subseleksi lagi. Saya memiliki masalah yang sama sebelumnya dan saya hanya mengubah karakter dan kemudian kembali ke faktor.
sumber
factor(as.chracter(...))
bekerja, tetapi kurang efisien dan ringkas daripadafactor(...)
. Tampaknya benar-benar lebih buruk daripada jawaban yang lain.Sayangnya faktor () tampaknya tidak berfungsi ketika menggunakan rxDataStep dari RevoScaleR. Saya melakukannya dalam dua langkah: 1) Konversi ke karakter dan simpan dalam bingkai data eksternal sementara (.xdf). 2) Konversi kembali ke faktor dan simpan dalam bingkai data eksternal yang pasti. Ini menghilangkan tingkat faktor yang tidak digunakan, tanpa memuat semua data ke dalam memori.
sumber
Telah mencoba sebagian besar contoh di sini jika tidak semua tetapi tidak ada yang tampaknya berfungsi dalam kasus saya. Setelah berjuang cukup lama saya mencoba menggunakan as.character () pada kolom faktor untuk mengubahnya menjadi col dengan string yang sepertinya berfungsi dengan baik.
Tidak yakin untuk masalah kinerja.
sumber