Хотите знать, сталкивался ли кто-нибудь с пакетом / функцией в R, которая объединит уровни фактора, доля всех уровней которого меньше некоторого порога? В частности, одним из первых шагов в подготовке данных, которые я выполняю, является объединение разреженных уровней факторов вместе (скажем, в уровень, называемый «Другой»), которые не составляют, по крайней мере, скажем, 2% от общего количества. Это делается без присмотра и делается, когда цель состоит в том, чтобы смоделировать какую-либо деятельность в маркетинге (не обнаружение мошенничества, где эти очень малые случаи могут быть чрезвычайно важны). Я ищу функцию, которая будет сворачивать уровни, пока не будет достигнута некоторая пороговая пропорция.
ОБНОВИТЬ:
Благодаря этим замечательным предложениям я довольно легко написал функцию. Я действительно осознал, что было возможно свернуть уровни с пропорцией <минимум и все же иметь этот перекодированный уровень как <минимум, требующий добавления самого низкого уровня с пропорцией> минимум. Вероятно, может быть более эффективным, но, похоже, работает. Следующим улучшением будет выяснение того, как собрать «правила» применения логики свертывания к новым данным (проверочный набор или будущие данные).
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
источник
Ответы:
Кажется, это просто вопрос «перераспределения» фактора; нет необходимости вычислять частичные суммы или делать копию исходного вектора. Например,
Здесь исходные уровни факторов распределены следующим образом:
а потом становится
Это может быть удобно заключено в функцию. В пакете reshape есть
combine_factor()
функция , так что, думаю, она тоже может быть полезной.Кроме того, поскольку вы, похоже, заинтересованы в извлечении данных, вы можете взглянуть на пакет Caret . Он имеет много полезных функций для предварительной обработки данных, включая такие функции,
nearZeroVar()
которые позволяют помечать предикторы с очень несбалансированным распределением наблюдаемых значений (см., Например, виньетка, пример данных, функции предварительной обработки, визуализации и другие функции , стр. 5 использования).источник
a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
.Единственная проблема с ответом Кристофера состоит в том, что он перепутает первоначальное упорядочение фактора. Вот мое исправление:
где
change.levels
следующая функция. Я написал это некоторое время назад, так что я подозреваю, что могут быть лучшие способы достижения того, что он делает.источник
Я написал быструю функцию, которая достигнет этой цели. Я начинающий пользователь R, поэтому он может быть медленным с большими таблицами.
Как пример этого в действии:
источник