Um dos tipos de dados básicos em R são os fatores. Na minha experiência, os fatores são basicamente uma dor e eu nunca os uso. Sempre me converto em personagens. Eu me sinto estranhamente como se estivesse faltando alguma coisa.
Existem alguns exemplos importantes de funções que usam fatores como variáveis de agrupamento onde o tipo de dados do fator se torna necessário? Existem circunstâncias específicas em que devo usar fatores?
r
language-design
internals
r-factor
JD Long
fonte
fonte
Respostas:
Você deve usar fatores. Sim, eles podem ser uma dor, mas minha teoria é que 90% da razão pela qual eles são uma dor é porque em
read.table
eread.csv
, o argumentostringsAsFactors = TRUE
por padrão (e a maioria dos usuários não percebe essa sutileza). Eu digo que eles são úteis porque os pacotes de ajuste de modelo como o lme4 usam fatores e fatores ordenados para ajustar os modelos de forma diferenciada e determinar o tipo de contraste a ser usado. E os pacotes de gráficos também os usam para agrupar.ggplot
e a maioria das funções de ajuste de modelo coage os vetores de caracteres a fatores, de modo que o resultado é o mesmo. No entanto, você acaba com avisos em seu código:Uma coisa complicada é a parte inteira
drop=TRUE
. Em vetores, isso funciona bem para remover níveis de fatores que não estão nos dados. Por exemplo:Porém , com
data.frame
s, o comportamento de[.data.frame()
é diferente: consulte este e-mail ou?"[.data.frame"
. Usardrop=TRUE
nodata.frame
s não funciona como você imagina:Felizmente, você pode eliminar fatores facilmente com
droplevels()
a redução dos níveis de fator não utilizados para um fator individual ou para cada fator em adata.frame
(desde R 2.12):É assim que você evita que os níveis selecionados cheguem às
ggplot
lendas.Internamente,
factor
s são inteiros com um vetor de caracteres de nível de atributo (consulteattributes(iris$Species)
eclass(attributes(iris$Species)$levels)
), que é limpo. Se você tivesse que alterar o nome de um nível (e estivesse usando cadeias de caracteres), esta seria uma operação muito menos eficiente. E eu mudo muito os nomes dos níveis, especialmente paraggplot
lendas. Se você falsificar fatores com vetores de personagens, existe o risco de alterar apenas um elemento e, acidentalmente, criar um novo nível separado.fonte
stringsAsFactors
não é uma função.fatores ordenados são fantásticos, se por acaso eu amo laranjas e odeio maçãs, mas não me importo com uvas, não preciso gerenciar algum índice estranho para dizer isso:
fonte
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
? Eu teria imaginado que ele ordenou isso no quadro de dados, mas depois que executo essa linha e imprimo o quadro de dados, nada muda. Ele apenas impõe uma ordem interna, embora a ordem impressa não mude?A
factor
é mais análogo a um tipo enumerado em outras línguas. Seu uso apropriado é para uma variável que só pode assumir um dos conjuntos de valores prescritos. Nesses casos, nem todos os valores permitidos possíveis podem estar presentes em qualquer conjunto específico de dados e os níveis "vazios" refletem isso com precisão.Considere alguns exemplos. Para alguns dados coletados em todos os Estados Unidos, o estado deve ser registrado como um fator. Nesse caso, o fato de nenhum caso ter sido coletado de um determinado estado é relevante. Poderia haver dados daquele estado, mas aconteceu (por qualquer motivo, que pode ser um motivo de interesse) não haver. Se a cidade natal fosse coletada, não seria um fator. Não há um conjunto pré-estabelecido de possíveis cidades natais. Se os dados fossem coletados de três cidades ao invés de nacionalmente, a cidade seria um fator: há três escolhas que foram dadas no início e se nenhum caso / dado relevante foi encontrado em uma dessas três cidades, isso é relevante.
Outros aspectos de
factor
s, como fornecer uma maneira de dar uma ordem de classificação arbitrária a um conjunto de strings, são características secundárias úteis defactor
s, mas não são a razão de sua existência.fonte
Os fatores são fantásticos quando se está fazendo análises estatísticas e realmente explorando os dados. No entanto, antes disso, quando alguém está lendo, limpando, solucionando problemas, mesclando e geralmente manipulando os dados, os fatores são uma dor total. Mais recentemente, como nos últimos anos, muitas funções foram aprimoradas para lidar melhor com os fatores. Por exemplo, rbind funciona bem com eles. Ainda acho um aborrecimento total ter deixado níveis vazios após uma função de subconjunto.
Eu sei que é simples recodificar os níveis de um fator e reorganizar os rótulos, e também há maneiras maravilhosas de reorganizar os níveis. Meu cérebro simplesmente não consegue se lembrar deles e tenho que reaprendê-lo toda vez que o uso. A recodificação deve ser muito mais fácil do que é.
As funções string de R são muito fáceis e lógicas de usar. Portanto, quando estou manipulando, geralmente prefiro personagens a fatores.
fonte
droplevels()
. E não reordena os fatores por padrão.Que título sarcástico!
Acredito que muitas funções de estimativa permitem que você use fatores para definir facilmente variáveis dummy ... mas não os uso para isso.
Eu os uso quando tenho vetores de caracteres muito grandes com poucas observações exclusivas. Isso pode reduzir o consumo de memória, especialmente se as strings no vetor de caracteres forem mais longas.
PS - Estou brincando sobre o título. Eu vi seu tweet. ;-)
fonte
?factor
ele, era R-2.6.0 e diz: "Os valores inteiros são armazenados em 4 bytes, ao passo que cada referência a uma string de caracteres precisa de um ponteiro de 4 ou 8 bytes." Você economizaria espaço convertendo em fator se a string de caracteres precisasse de 8 bytes?N=100000
eu tenho 391,5 Kb vs 391,8 Kb. Portanto, o fator ocupa um pouco mais de memória.Fatores são um excelente mecanismo de crachá de "caixas exclusivas". Eu recriei mal isso muitas vezes e, apesar de algumas rugas ocasionalmente, elas são extremamente poderosas.
Se houver uma maneira melhor de fazer essa tarefa, eu adoraria ver, não vejo essa capacidade de
factor
discutida.fonte
tapply (e agregar ) dependem de fatores. A relação informação-esforço dessas funções é muito alta.
Por exemplo, em uma única linha de código (a chamada para tocar abaixo), você pode obter o preço médio dos diamantes por corte e cor:
fonte