Querendo saber se alguém já se deparou com um pacote / função em R que combinará níveis de um fator cuja proporção de todos os níveis de um fator seja menor que algum limite? Especificamente, uma das primeiras etapas na preparação de dados que eu conduzo é recolher níveis esparsos de fatores (digamos, em um nível chamado 'Outro') que não constituam pelo menos 2% do total. Isso é feito sem supervisão e é feito quando o objetivo é modelar alguma atividade de marketing (não a detecção de fraudes, onde essas ocorrências muito pequenas podem ser extremamente importantes). Eu estou procurando por uma função que reduza os níveis até que alguma proporção de limite seja atingida.
ATUALIZAR:
Graças a essas ótimas sugestões, escrevi uma função com bastante facilidade. Percebi, porém, que era possível reduzir os níveis com proporção <o mínimo e ainda assim esse nível recodificado ser <o mínimo, exigindo a adição do nível mais baixo com proporção> o mínimo. Provavelmente pode ser mais eficiente, mas parece funcionar. O próximo aprimoramento seria descobrir como capturar as "regras" para aplicar a lógica de recolhimento a novos dados (um conjunto de validação ou dados futuros).
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
fonte
Respostas:
Parece que é apenas uma questão de "relevância" do fator; não é necessário calcular somas parciais ou fazer uma cópia do vetor original. Por exemplo,
Aqui, os níveis dos fatores originais são distribuídos da seguinte maneira:
e então se torna
Pode ser convenientemente envolvido em uma função. Há uma
combine_factor()
função no pacote remodelar , então acho que poderia ser útil também.Além disso, como você parece interessado em mineração de dados, pode dar uma olhada no pacote de intercalação . Possui muitos recursos úteis para pré-processamento de dados, incluindo funções como
nearZeroVar()
essa que permitem sinalizar preditores com distribuição muito desequilibrada dos valores observados (consulte a vinheta, dados de exemplo, funções de pré-processamento, visualizações e outras funções , p. 5, por exemplo de uso).fonte
a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
,.O único problema com a resposta de Christopher é que ela misturará a ordem original do fator. Aqui está a minha correção:
Onde
change.levels
está a seguinte função. Eu o escrevi há algum tempo, então suspeito que possa haver melhores maneiras de conseguir o que faz.fonte
Eu escrevi uma função rápida que cumprirá esse objetivo. Eu sou um usuário R iniciante, por isso pode ser lento com tabelas grandes.
Como um exemplo disso em ação:
fonte