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
źródło
Odpowiedzi:
Wydaje się, że to tylko kwestia „trafności” tego czynnika; nie trzeba obliczać sum częściowych ani wykonywać kopii oryginalnego wektora. Na przykład,
Tutaj pierwotne poziomy współczynników są podzielone w następujący sposób:
i wtedy staje się
Może być dogodnie zawinięty w funkcję. W pakiecie przekształcającym jest
combine_factor()
funkcja , więc myślę, że może być również przydatna.Ponadto, jeśli wydajesz się zainteresowany eksploracją danych, możesz rzucić okiem na pakiet Caret . Ma wiele przydatnych funkcji do wstępnego przetwarzania danych, w tym takie funkcje,
nearZeroVar()
które pozwalają na oznaczanie predyktorów z bardzo niezrównoważonym rozkładem obserwowanych wartości (patrz na przykład winieta, dane, funkcje przetwarzania wstępnego, wizualizacje i inne funkcje , s. 5) użytkowania).źródło
a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
.Jedyny problem z odpowiedzią Christophera polega na tym, że pomieszane zostanie oryginalne uporządkowanie tego czynnika. Oto moja poprawka:
gdzie
change.levels
jest następująca funkcja. Napisałem to jakiś czas temu, więc podejrzewam, że mogą istnieć lepsze sposoby na osiągnięcie tego, co robi.źródło
Napisałem szybką funkcję, która osiągnie ten cel. Jestem początkującym użytkownikiem R, więc może być powolny przy dużych tabelach.
Jako przykład tego w akcji:
źródło