Zastanawiasz się, czy ktoś natknął się na pakiet / funkcję w R, która połączy poziomy współczynnika, którego proporcja wszystkich poziomów w współczynniku jest mniejsza niż pewien próg? Konkretnie, jednym z pierwszych kroków w przygotowaniu danych, które przeprowadzam, jest zwinięcie razem nielicznych poziomów czynników (powiedzmy na poziomie zwanym „Inne”), które nie stanowią co najmniej, powiedzmy, 2% całości. Odbywa się to bez nadzoru i ma miejsce, gdy celem jest modelowanie niektórych działań marketingowych (nie wykrywanie oszustw, w których te bardzo małe zdarzenia mogą być niezwykle ważne). Szukam funkcji, która zwija poziomy, dopóki nie zostanie osiągnięta pewna część progu.
AKTUALIZACJA:
Dzięki tym świetnym sugestiom dość łatwo napisałem funkcję. Zdałem sobie jednak sprawę, że możliwe było zawalenie poziomów z proporcją <minimum i nadal mieć ten przekodowany poziom <minimum, wymagający dodania najniższego poziomu z proporcją> minimum. Prawdopodobnie może być bardziej wydajny, ale wydaje się, że działa. Kolejnym ulepszeniem byłoby wymyślenie, jak uchwycić „reguły” stosowania logiki zwijania do nowych danych (zestaw sprawdzania poprawności lub dane przyszłe).
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