Sie fragen sich, ob jemand in R auf ein Paket / eine Funktion gestoßen ist, die Ebenen eines Faktors kombiniert, dessen Anteil an allen Ebenen in einem Faktor unter einem bestimmten Schwellenwert liegt? Insbesondere besteht einer der ersten Schritte bei der Datenaufbereitung darin, spärliche Ebenen von Faktoren zusammenzufassen (z. B. zu einer Ebene namens "Andere"), die nicht mindestens 2% der Gesamtmenge ausmachen. Dies geschieht unbeaufsichtigt und dann, wenn das Ziel darin besteht, bestimmte Aktivitäten im Marketing zu modellieren (keine Betrugserkennung, bei der diese sehr kleinen Vorkommnisse äußerst wichtig sein können). Ich suche nach einer Funktion, die Ebenen zusammenbricht, bis ein bestimmter Schwellenwert erreicht ist.
AKTUALISIEREN:
Dank dieser großartigen Vorschläge habe ich ziemlich einfach eine Funktion geschrieben. Mir war jedoch klar, dass es möglich war, Ebenen mit einem Anteil <dem Minimum zu kollabieren und diesen neu codierten Wert dennoch <das Minimum zu haben, was die Hinzufügung des niedrigsten Niveaus mit Anteil> dem Minimum erforderlich machte. Kann wahrscheinlich effizienter sein, aber es scheint zu funktionieren. Die nächste Verbesserung wäre, herauszufinden, wie die "Regeln" für die Anwendung der Kollapslogik auf neue Daten (einen Validierungssatz oder zukünftige Daten) erfasst werden können.
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
quelle
Antworten:
Es scheint nur eine Frage des "Neuentwickelns" des Faktors zu sein; Es ist nicht erforderlich, Teilsummen zu berechnen oder eine Kopie des ursprünglichen Vektors zu erstellen. Z.B,
Hier sind die ursprünglichen Faktorstufen wie folgt verteilt:
und dann wird es
Es kann bequem in eine Funktion eingewickelt werden.
combine_factor()
Das Umformungspaket enthält eine Funktion , daher könnte sie auch nützlich sein.Wenn Sie an Data Mining interessiert zu sein scheinen, sollten Sie sich auch das Caret- Paket ansehen . Es verfügt über viele nützliche Funktionen für die Datenvorverarbeitung, einschließlich solcher Funktionen
nearZeroVar()
, mit denen Prädiktoren mit einer sehr unausgewogenen Verteilung der beobachteten Werte gekennzeichnet werden können (siehe Vignette, Beispieldaten, Vorverarbeitungsfunktionen, Visualisierungen und andere Funktionen , S. 5) von Nutzen).quelle
a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
.Das einzige Problem mit der Antwort von Christopher ist, dass die ursprüngliche Reihenfolge des Faktors verwechselt wird. Hier ist mein Fix:
Wo
change.levels
ist die folgende Funktion. Ich habe es vor einiger Zeit geschrieben, daher vermute ich, dass es bessere Möglichkeiten gibt, das zu erreichen, was es tut.quelle
Ich habe eine schnelle Funktion geschrieben, die dieses Ziel erreicht. Ich bin ein unerfahrener R-Benutzer, daher kann es bei großen Tabellen langsam sein.
Als Beispiel dafür in Aktion:
quelle