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
la source
Réponses:
Il semble que ce soit juste une question de «relancer» le facteur; pas besoin de calculer des sommes partielles ou de faire une copie du vecteur d'origine. Par exemple,
Ici, les niveaux de facteur d'origine sont répartis comme suit:
puis ça devient
Il peut être commodément enveloppé dans une fonction. Il y a une
combine_factor()
fonction dans le package de remodelage , donc je suppose que cela pourrait aussi être utile.De plus, comme vous semblez intéressé par l'exploration de données, vous pouvez jeter un œil au package caret . Il possède de nombreuses fonctionnalités utiles pour le prétraitement des données, y compris des fonctions telles
nearZeroVar()
que celles qui permettent de signaler les prédicteurs avec une distribution très déséquilibrée des valeurs observées (voir la vignette, les exemples de données, les fonctions de prétraitement, les visualisations et d'autres fonctions , p. 5, par exemple utile).la source
a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
.Le seul problème avec la réponse de Christopher est qu'elle va mélanger l'ordre d'origine du facteur. Voici ma solution:
où
change.levels
est la fonction suivante. Je l'ai écrit il y a quelque temps, donc je pense qu'il pourrait y avoir de meilleures façons de réaliser ce qu'il fait.la source
J'ai écrit une fonction rapide qui permettra d'atteindre cet objectif. Je suis un utilisateur novice de R, donc cela peut être lent avec de grandes tables.
À titre d'exemple en action:
la source