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.

  • 🏷️ Estrutura: Um fator contém códigos inteiros mais um atributo de níveis, de forma que cada categoria seja validada em relação a uma lista fixa.
  • 🧩 Criação: A função `factor()` converte um vetor de caracteres, e a função `class()` confirma se o resultado foi alterado de caractere para fator.
  • 🔘 Nominal: Sem um argumento de níveis, o R ordena as categorias por si só, portanto, nenhuma classificação entre cores ou gêneros é implícita.
  • 📊 Ordinal: Ao passar `ordered = TRUE` com um vetor de níveis explícito, a classificação é fixada do mais baixo para o mais alto.
  • 🔢 Contínuo: As colunas numéricas e inteiras permanecem contínuas por padrão, como demonstra class(mtcars$mpg).
  • ⚠️ Armadilha de conversão: O método `as.numeric()` aplicado a um fator retorna os códigos de nível, portanto, leia o rótulo usando `levels()` primeiro.
  • 🧠 Manutenção: A função `relevel()` define a linha de base do modelo e a função `droplevels()` remove as categorias deixadas para trás por um subconjunto.

Fator em R: Variáveis ​​Categóricas e Contínuas

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.

Perguntas Frequentes

Quando o argumento `levels` não é fornecido, a função `factor()` chama `unique()` e ordena os valores em ordem crescente. Essa ordenação depende da localidade ativa, portanto, nem sempre é ASCII puro. Forneça o argumento `levels` explicitamente sempre que a ordem tiver algum significado.

`table(f)` retorna uma contagem nomeada para cada nível, e `prop.table(table(f))` converte essas contagens em proporções. Ambas mantêm os níveis vazios visíveis, o que as torna úteis para identificar categorias que desapareceram após a filtragem. quadro de dados.

A função `factor()` compara cada elemento com os níveis fornecidos e qualquer valor sem correspondência torna-se `NA` em vez de gerar um erro. Verifique `setdiff(unique(x), your_levels)` antes de converter e fique atento a espaços em branco ou diferenças de capitalização nos dados de origem.

A função `cut()` divide um vetor numérico nos pontos de quebra especificados e retorna um fator. Forneça rótulos para nomes de bandas legíveis e defina `ordered_result = TRUE` quando as bandas forem classificadas. A função `findInterval()` é uma alternativa mais rápida quando apenas o índice do intervalo é necessário.

Desde o R 4.0.0, o padrão de fábrica para data.frame() e read.csv() é stringsAsFactors = FALSE, portanto, as colunas de texto permanecem como caracteres. Scripts mais antigos que dependiam da conversão automática agora devem chamar factor() explicitamente nas colunas que modelam.

Less do que antes. A documentação básica do R observa que strings idênticas agora compartilham o mesmo espaço de armazenamento, portanto a diferença é pequena na maioria dos casos. Os fatores ainda compensam ao validar categorias e ao corrigir a ordem dos níveis usados ​​em modelos e gráficos.

A maioria das funções de modelagem aceita fatores diretamente e constrói contrastes fictícios automaticamente, enquanto muitas aprendizado de máquina Os pacotes esperam uma matriz numérica. `model.matrix()` ou a codificação one-hot resolvem esse problema, e um fator ordenado pode manter sua classificação.

Sim. Travas deslizantes portáteis Copiloto do GitHub Funciona no RStudio 2023.09.0 e versões posteriores e sugere complementos a partir dos comentários e do código no arquivo aberto. Considere a ordem dos níveis e o tratamento de valores NA como sugestões a serem verificadas, não como fatos.

Resuma esta postagem com: