Цікаво, чи хтось перебігав пакет / функцію в R, який буде поєднувати рівні фактора, частка яких у всіх коефіцієнтах менша за деякий поріг? Зокрема, одним із перших етапів підготовки даних, який я веду, є згуртування рідких рівнів факторів разом (скажімо, на рівень, який називається "Інше"), які не складають принаймні 2% від загальної кількості. Це робиться без нагляду та робиться тоді, коли мета полягає в моделюванні деякої діяльності з маркетингу (а не виявлення шахрайства, де ці дуже малі події можуть бути надзвичайно важливими). Я шукаю функцію, яка згортатиме рівні до тих пір, поки не буде виконана деяка порогова пропорція.
ОНОВЛЕННЯ:
Завдяки цим чудовим пропозиціям я написав функцію досить легко. Хоча я зрозумів, що можна згортати рівні пропорційно <мінімуму, і все-таки дозволено, що цей рівень заздалегідь буде <мінімум, вимагаючи додавання найнижчого рівня з пропорцією> мінімального. Ймовірно, це може бути більш ефективним, але, здається, працює. Наступним вдосконаленням було б з'ясувати, як зафіксувати "правила" для застосування логіки згортання до нових даних (набір перевірки або майбутні дані).
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