Fator em R: Variável Categórica e Variáveis Contínuas
⚡ Resumo Inteligente
O fator `factor` em R armazena dados categóricos como um vetor de códigos inteiros emparelhados com um conjunto de níveis, que é como a linguagem separa um grupo limitado de categorias de uma medição contínua.
O que é fator em R?
Fator em R `factor` é uma variável usada para categorizar e armazenar dados, possuindo um número limitado de valores diferentes. Ela armazena os dados como um vetor de valores inteiros. Em R, `factor` também é conhecida como uma variável categórica que armazena valores de dados tanto em formato de texto quanto inteiro como níveis. `factor` é usada principalmente em modelagem estatística e análise exploratória de dados com R.
Internamente, um fator consiste em dois objetos que viajam juntos: um vetor de inteiros contendo códigos e um atributo de caractere chamado níveisCada código representa uma posição nesse vetor de níveis, razão pela qual imprimir um fator exibe palavras enquanto desclassificar() Mostra números.
Num conjunto de dados, podemos distinguir dois tipos de variáveis: categórico e contínuo.
- Nas estatísticas descritivas para variáveis categóricas em R, o valor é limitado e geralmente baseado em um determinado grupo finito. Por exemplo, uma variável categórica em R pode ser países, ano, sexo, ocupação.
- Uma variável contínua, no entanto, pode assumir qualquer valor, de inteiro a decimal. Por exemplo, podemos ter a receita, o preço de uma ação, etc.
Essa distinção é importante, pois o R escolhe silenciosamente valores padrão diferentes para cada um. Uma coluna numérica é resumida com a média e a mediana, enquanto um fator é resumido com contagens por nível. Armazenar uma categoria como texto ou como número, portanto, altera a análise obtida. O conjunto mais amplo de modos de armazenamento é abordado no guia para Tipos de dados e operadores em R.
Variáveis categóricas
Variáveis categóricas em R são armazenadas em um fator. Vejamos o código abaixo para converter uma variável de caractere em uma variável de fator em R. Muitas rotinas de modelagem e aprendizado de máquina não conseguem processar texto bruto, portanto, as categorias precisam ser codificadas como níveis ou como números antes que o modelo seja ajustado.
Sintaxe
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
A documentação de referência do R base apresenta dois argumentos adicionais que a forma abreviada acima omite: excluir, que remove valores antes da construção do conjunto de nível, e nmax, um limite superior para o número de níveis que acelera a conversão de vetores muito grandes.
Argumentos:
- x: Um vetor de dados categóricos em R. Deve ser uma string ou um número inteiro, não decimal.
- níveis: Um vetor de valores possíveis que x pode assumir. Este argumento é opcional. O valor padrão é a lista única de itens do vetor x, ordenados em ordem crescente.
- LabelsAdicione um rótulo aos dados categóricos x em R. Por exemplo, 1 pode receber o rótulo "masculino" e 0, o rótulo "feminino".
- excluirUm vetor de valores a serem descartados quando o conjunto de nível for formado. Os valores excluídos tornam-se NA no resultado.
- ordenado: Um indicador lógico que determina se os níveis devem ser considerados ordenados, na ordem em que foram apresentados.
- nmax: Um limite superior opcional para o número de níveis, útil para vetores longos.
Exemplo:
Vamos converter um vetor de caracteres em um fator e confirmar a alteração com a função class().
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
Saída:
## [1] "character" ## [1] "factor"
A classe mudou de caractere para fator, e nada nos valores impressos mudou. É importante transformar um corda Em R, as categorias são transformadas em variáveis categóricas antes de uma tarefa de aprendizado de máquina, pois é nesse ponto que se tornam um conjunto fixo e validado.
Uma variável categórica em R pode ser dividida em variável categórica nominal e variável categórica ordinal.
Variável Categórica Nominal
Uma variável categórica nominal possui vários valores, mas a ordem não importa. Por exemplo, masculino ou feminino. Variáveis categóricas nominais em R não possuem nenhuma ordenação.
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
Saída:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
A partir do `factor_color`, não conseguimos determinar nenhuma ordem. A lista de níveis está em ordem alfabética apenas porque nenhum argumento `levels` foi fornecido, então o R ordenou os valores únicos automaticamente. Essa ordenação segue a localidade ativa em vez do ASCII puro, o que é um dos motivos para declarar os níveis explicitamente sempre que a ordem for importante.
Variável categórica ordinal
Variáveis categóricas ordinais possuem uma ordenação natural. A classificação deriva da ordem do vetor passado para a função. níveis argumento, e `ordered = TRUE` instrui o R a tratar essa sequência como uma classificação em vez de uma simples lista. Definir `ordered = FALSE` não inverte a classificação; simplesmente produz um fator não ordenado comum. Para classificar do mais alto para o mais baixo, inverta o próprio vetor `levels`.
Exemplo:
Podemos usar resumo para contar os valores de cada variável de fator em R.
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
Saída:
## [1] evening morning afternoon midday
midnight evening
O console imprime primeiro os valores e, em seguida, a classificação. O bloco seguinte começa com a linha Levels, ainda comentada, para que a classificação permaneça visível enquanto a chamada summary() é anexada ao código anterior.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Saída:
## morning midday afternoon evening midnight ## 1 1 1 2 1
O R ordenou o nível de 'manhã' a 'meia-noite', conforme especificado no argumento `levels`. Como o fator é ordenado, operadores de comparação como `<` e `>` também funcionam nele, o que não ocorre com o fator de cor nominal acima.
Variáveis Contínuas
Em R, as variáveis contínuas são o padrão. Elas são armazenadas como numéricas ou inteiras. Podemos ver isso no conjunto de dados abaixo. `mtcars` é um conjunto de dados integrado que reúne informações sobre diferentes tipos de carros. Podemos importá-lo usando `mtcars` e verificar a classe da variável `mpg` (milhas por galão). Ela retorna um valor numérico, indicando que se trata de uma variável contínua.
dataset <- mtcars class(dataset$mpg)
saída
## [1] "numeric"
Nem toda coluna numérica é verdadeiramente contínua. No mesmo conjunto de dados, `cyl` contém apenas 4, 6 e 8, e `am` contém apenas 0 e 1; portanto, ambas são categorias que por acaso são armazenadas como números. Convertê-las com `factor()` antes da modelagem impede que o R trate a diferença entre 4 e 6 cilindros como uma quantidade medida. A operação inversa, dividir uma coluna contínua em faixas, é feita com `cut()`.
Níveis e rótulos de fatores em R
O atributo `levels` é a parte de um fator que você mais ajustará, pois controla tanto o que é impresso quanto o que um modelo considera como linha de base. Quatro funções auxiliares básicas do R abrangem quase todos os casos.
| função | O que ele faz | Uso típico |
|---|---|---|
| níveis(f) | Lê ou substitui os nomes dos níveis. | Renomear abreviações para rótulos legíveis. |
| nlevels(f) | Retorna o número de níveis. | A verificação de uma categoria não explodiu após uma junção. |
| relevel(f, ref) | Move-se um nível para a frente. | Escolhendo a linha de base para uma regressão |
| droplevels(f) | Remove níveis com zero observações. | Limpeza após a criação de subconjuntos ou filtragem |
O bloco abaixo aplica todos os quatro fatores de cor e gênero criados anteriormente.
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
Vale a pena lembrar dois detalhes. Atribuir valores a `levels()` renomeia os valores por posição, então um vetor incompatível rotula silenciosamente a categoria errada. E um subconjunto mantém todos os níveis originais até que `droplevels()` seja chamado, razão pela qual um vetor filtrado quadro de dados Ainda é possível plotar barras vazias. Labels O argumento é diferente novamente: ele nomeia os níveis no momento da criação, e rótulos duplicados mesclam vários valores de entrada em um único nível.
Como converter um fator em um valor numérico ou de caractere em R
Este é o erro mais comum relacionado a fatores no R. Como um fator armazena códigos inteiros, chamar `as.numeric()` nele retorna esses códigos em vez dos valores que você vê na tela. Um fator dos anos de 2021 a 2023 retorna os valores 1, 2 e 3.
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
A documentação base do R recomenda `as.numeric(levels(f))[f]` como a rota correta e ligeiramente mais rápida, com `as.numeric(as.character(f))` como o equivalente mais fácil de ler. Ambos leem o rótulo primeiro e convertem depois.
- Fator para o personagem: as.character(f) retorna os rótulos como texto simples.
- Códigos de conversão de fator para inteiro: as.integer(f) ou unclass(f) quando os códigos são o que você realmente deseja.
- Característica para fator: factor(x) ou o atalho mais rápido as.factor(x).
- Numérico para fator: factor(x) para códigos discretos, cut(x, breaks) para valores contínuos que precisam de agrupamento.
Uma salvaguarda se aplica a todos eles. Se um valor em x não aparecer no vetor de níveis, factor() define esse elemento como NA em vez de gerar um erro, de modo que um espaço perdido ou uma diferença de maiúsculas e minúsculas pode excluir linhas silenciosamente. Comparando valores únicos antes e depois da conversão, ou ordenando o quadro de dados Na nova coluna, o problema fica rapidamente exposto.
Fator vs. Caractere vs. Numérico em R: Quando usar cada um
Escolher o modo de armazenamento logo no início economiza muito tempo de depuração posteriormente. A tabela compara os três modos que uma coluna de texto ou código pode assumir.
| Propriedade | Fator | Personagem | Numérico |
|---|---|---|---|
| Armazenado como | Códigos inteiros mais um atributo de níveis | Cordas | Doubles ou números inteiros |
| Conjunto fixo de valores | Sim, definido por níveis | Não | Não |
| pedido de exibição personalizado | Sim, por níveis | Somente em ordem alfabética | Somente numérico |
| Aritmética | Não permitido | Não permitido | Permitido |
| Contrastes de modelos | Construído automaticamente | Coagido primeiro | Tratado como uma medida |
Usar um fator Quando os valores provêm de uma lista fechada conhecida, quando a ordem de exibição ou classificação é importante, ou quando a coluna alimenta um modelo ou uma legenda de gráfico. Use personagem Para texto livre, identificadores e qualquer coisa que você vá analisar ou combinar, como nomes, notas e códigos que continuam chegando com novos valores. Use numérico Somente quando a distância entre dois valores for significativa.
O bloco abaixo mostra as maneiras mais rápidas de verificar o que você realmente possui.
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
Dois hábitos mantêm a escolha honesta. Execute `sapply(df, class)` após cada importação, pois um único caractere perdido em uma coluna numérica transforma a coluna inteira em texto. E converta para fator o mais tarde possível, após os dados serem limpos e unidos, para que dplyr As operações de junção e filtragem ainda comparam strings simples em vez de conjuntos de níveis incompatíveis.

