Vous vous demandez si quelqu'un a traversé un package / une fonction dans R qui combinera les niveaux d'un facteur dont la proportion de tous les niveaux d'un facteur est inférieure à un certain seuil? Plus précisément, l'une des premières étapes de la préparation des données que je mène est de regrouper des niveaux clairsemés de facteurs (par exemple en un niveau appelé «Autre») qui ne constituent pas au moins, disons, 2% du total. Cela se fait sans surveillance et se fait lorsque l'objectif est de modéliser une certaine activité dans le marketing (pas la détection de fraude, où ces très petits événements pourraient être extrêmement importants). Je recherche une fonction qui réduira les niveaux jusqu'à ce qu'une certaine proportion seuil soit atteinte.
METTRE À JOUR:
Grâce à ces excellentes suggestions, j'ai écrit une fonction assez facilement. J'ai réalisé cependant qu'il était possible de réduire les niveaux avec une proportion <le minimum et que ce niveau recodé soit toujours <le minimum, ce qui nécessitait l'ajout du niveau le plus bas avec la proportion> le minimum. Probablement peut être plus efficace mais cela semble fonctionner. La prochaine amélioration consisterait à comprendre comment capturer les "règles" pour appliquer la logique d'effondrement à de nouvelles données (un ensemble de validation ou des données futures).
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