Ingin tahu apakah ada yang menjalankan paket / fungsi dalam R yang akan menggabungkan level faktor yang proporsinya dari semua level dalam faktor kurang dari ambang tertentu? Secara khusus, salah satu langkah pertama dalam persiapan data yang saya lakukan adalah meruntuhkan tingkat faktor yang jarang (katakanlah ke tingkat yang disebut 'Lain-lain') yang tidak membentuk setidaknya, katakanlah, 2% dari total. Ini dilakukan tanpa pengawasan dan dilakukan ketika tujuannya adalah untuk memodelkan beberapa kegiatan dalam pemasaran (bukan deteksi penipuan, di mana kejadian yang sangat kecil itu bisa sangat penting). Saya mencari fungsi yang akan runtuh level sampai sebagian ambang batas terpenuhi.
MEMPERBARUI:
Berkat saran-saran hebat ini saya menulis sebuah fungsi dengan cukup mudah. Namun saya menyadari bahwa adalah mungkin untuk menghancurkan level dengan proporsi <minimum dan masih memiliki level yang dikode ulang menjadi <minimum, membutuhkan penambahan level terendah dengan proporsi> minimum. Mungkin bisa lebih efisien tetapi tampaknya berhasil. Peningkatan selanjutnya adalah mencari cara untuk menangkap "aturan" untuk menerapkan logika runtuh ke data baru (satu set validasi atau data masa depan).
collapseFactors<- function(tableName,minPercent=5,fillIn ="RECODED" )
{
for (i in 1:ncol(tableName))
{
if(is.factor(tableName[,i]) == TRUE) #process just factors
{
sortedTable<-sort(prop.table(table(tableName[,i])))
numberToCollapse<-length(sortedTable[sortedTable<(minPercent/100)])
if (sum(sortedTable[1:numberToCollapse])<(minPercent/100))
{
numberToCollapse=numberToCollapse+1 #add next level if < minPercent
}
if(numberToCollapse>1) #if not >1 then nothing to collapse
{
lf <- names(sortedTable[1:numberToCollapse])
levels(tableName[,i])[levels(tableName[,i]) %in% lf] <- fillIn
}
}#end if a factor
}#end for loop
return(tableName)
}#end function
sumber
Jawaban:
Sepertinya itu hanya masalah "melepaskan" faktor; tidak perlu menghitung jumlah sebagian atau membuat salinan vektor asli. Misalnya,
Di sini, tingkat faktor asli didistribusikan sebagai berikut:
dan kemudian menjadi
Mungkin mudah dibungkus menjadi suatu fungsi. Ada
combine_factor()
fungsi dalam paket membentuk kembali , jadi saya kira itu bisa berguna juga.Juga, karena Anda tampaknya tertarik pada penambangan data, Anda mungkin melihat paket caret . Ini memiliki banyak fitur yang berguna untuk preprocessing data, termasuk fungsi-fungsi seperti
nearZeroVar()
yang memungkinkan untuk menandai prediktor dengan distribusi nilai-nilai yang diamati yang sangat tidak seimbang (Lihat sketsa, contoh data, fungsi pra-pemrosesan, visualisasi dan fungsi lainnya , hal. 5, misalnya penggunaan).sumber
a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
,.Satu-satunya masalah dengan jawaban Christopher adalah bahwa itu akan mencampur urutan asli faktor tersebut. Ini perbaiki saya:
di mana
change.levels
fungsi berikut. Saya menulisnya beberapa waktu lalu, jadi saya curiga mungkin ada cara yang lebih baik untuk mencapai apa yang dilakukannya.sumber
Saya menulis fungsi cepat yang akan mencapai tujuan ini. Saya pengguna R pemula, jadi mungkin lambat dengan tabel besar.
Sebagai contoh dalam aksi:
sumber