Factorizar R: variable categórica y variables continuas

⚡ Resumen inteligente

En R, la función Factor almacena los datos categóricos como un vector de códigos enteros emparejados con un conjunto de niveles, que es la forma en que el lenguaje separa un grupo limitado de categorías de una medición continua.

  • 🏷️ Estructura: Un factor contiene códigos enteros más un atributo de niveles, por lo que cada categoría se valida con respecto a una lista fija.
  • 🧩 Creación: factor() convierte un vector de caracteres y class() confirma que el resultado cambió de carácter a factor.
  • 🔘 Nominal: Sin un argumento de niveles, R ordena las categorías por sí mismo, por lo que no se implica ninguna clasificación entre colores o géneros.
  • 📊 Ordinal: Si se pasa `ordered = TRUE` con un vector de niveles explícito, se fija la clasificación de menor a mayor.
  • 🔢 Continuo: Las columnas numéricas y enteras permanecen continuas por defecto, como demuestra la clase (mtcars$mpg).
  • ⚠️ Trampa de conversión: as.numeric() en un factor devuelve los códigos de nivel, así que primero lee la etiqueta a través de levels().
  • 🧠 Mantenimiento: relevel() establece la línea base del modelo y droplevels() elimina las categorías que quedan dejadas por un subconjunto.

Factor en R Variable categórica y variables continuas

¿Qué es el factor en R?

Factorizar R Es una variable que se utiliza para categorizar y almacenar datos, con un número limitado de valores diferentes. Almacena los datos como un vector de valores enteros. En R, el factor también se conoce como una variable categórica que almacena valores de datos tanto de cadena como enteros como niveles. El factor se utiliza principalmente en el modelado estadístico y el análisis exploratorio de datos con R.

Internamente, un factor son dos objetos que viajan juntos: un vector entero de códigos y un atributo de carácter llamado Cada código es una posición en ese vector de niveles, por eso imprimir un factor muestra palabras mientras unclass() muestra números.

En un conjunto de datos podemos distinguir dos tipos de variables: categórico y continuo.

  • En la estadística descriptiva de variables categóricas en R, el valor es limitado y generalmente se basa en un grupo finito particular. Por ejemplo, una variable categórica en R puede ser países, año, género, ocupación.
  • Una variable continua, sin embargo, puede tomar cualquier valor, desde enteros hasta decimales. Por ejemplo, podemos tener los ingresos, el precio de una acción, etc.

Esa distinción es importante, ya que R elige silenciosamente valores predeterminados diferentes para cada una. Una columna numérica se resume con una media y una mediana, mientras que un factor se resume con recuentos por nivel. Por lo tanto, almacenar una categoría como texto o como número cambia el análisis que se obtiene. El conjunto más amplio de modos de almacenamiento se trata en la guía de Tipos de datos y operadores de R.

Variables categóricas

Variables categóricas en R se almacenan en un factor. Veamos el código a continuación para convertir una variable de caracteres en una variable de factor en R. Muchas rutinas de modelado y aprendizaje automático no pueden procesar texto sin formato, por lo que las categorías deben codificarse como niveles o como números antes de ajustar el modelo.

Sintaxis

factor(x = character(), levels, labels = levels, ordered = is.ordered(x))

La documentación de referencia base de R incluye dos argumentos adicionales que la forma abreviada anterior omite: excluir, que elimina valores antes de que se construya el conjunto de niveles, y nmax, un límite superior en el número de niveles que acelera la conversión de vectores muy grandes.

Argumentos:

  • x: Un vector de datos categóricos en R. Debe ser una cadena de caracteres o un número entero, no decimal.
  • : Un vector con los posibles valores que puede tomar x. Este argumento es opcional. El valor predeterminado es la lista única de elementos del vector x, ordenados de forma ascendente.
  • etiquetas: Agrega una etiqueta a los datos categóricos x en R. Por ejemplo, 1 puede tomar la etiqueta masculino mientras que 0, la etiqueta femenino.
  • excluir: Un vector de valores que se descartarán cuando se forme el conjunto de nivel. Los valores excluidos se convierten en NA en el resultado.
  • ordenado: Un indicador lógico que determina si los niveles deben considerarse ordenados, en el orden dado.
  • nmax: Un límite superior opcional para el número de niveles, útil para vectores largos.

Ejemplo:

Vamos a convertir un vector de caracteres en un factor y confirmar el cambio con 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)

Salida:

## [1] "character"
## [1] "factor"

La clase cambió de carácter a factor, y nada de los valores impresos cambió. Es importante transformar un cadena en una variable de factor en R antes de una tarea de aprendizaje automático, porque ese es el punto en el que las categorías se convierten en un conjunto fijo y validado.

Una variable categórica en R se puede dividir en variable categórica nominal y variable categórica ordinal.

Variable categórica nominal

Una variable categórica nominal puede tener varios valores, pero el orden no importa. Por ejemplo, masculino o femenino. En R, las variables categóricas nominales no tienen ordenación.

# 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

Salida:

## [1] blue   red    green  white  black  yellow
## Levels: black blue green red white yellow

A partir del factor_color, no podemos determinar ningún orden. La lista de niveles está en orden alfabético únicamente porque no se proporcionó ningún argumento de niveles, por lo que R ordenó los valores únicos automáticamente. Esta ordenación sigue la configuración regional activa en lugar del código ASCII simple, lo cual es una razón para especificar los niveles explícitamente cuando el orden importa.

Variable categórica ordinal

Las variables categóricas ordinales sí tienen un orden natural. La clasificación proviene del orden del vector pasado a la Si se establece `ordered = TRUE`, se le indica a R que trate esa secuencia como una clasificación en lugar de una simple lista. Si se establece `ordered = FALSE`, no se invierte la clasificación; simplemente se genera un factor ordinario sin ordenar. Para clasificar de mayor a menor, se invierte el vector de niveles.

Ejemplo:

Podemos usar el resumen para contar los valores de cada variable de factor en 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

Salida:

## [1] evening   morning   afternoon midday    
midnight  evening

La consola imprime primero los valores y debajo la clasificación. El siguiente bloque comienza con la línea Levels, que aún está comentada, de modo que la clasificación permanece visible mientras se agrega la llamada a summary() al 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)

Salida:

##   morning    midday afternoon   evening  midnight
##         1         1         1         2         1

R ordenó el nivel desde 'mañana' hasta 'medianoche' según lo especificado en el argumento levels. Dado que el factor está ordenado, los operadores de comparación como < y > también funcionan con él, cosa que no ocurre con el factor de color nominal mencionado anteriormente.

Variables continuas

Las variables de clase continuas son el valor predeterminado en R. Se almacenan como numéricas o enteras. Podemos observarlo en el conjunto de datos que se muestra a continuación. `mtcars` es un conjunto de datos integrado que recopila información sobre diferentes tipos de automóviles. Podemos importarlo usando `mtcars` y verificar la clase de la variable `mpg` (millas por galón). Devuelve un valor numérico, lo que indica que se trata de una variable continua.

dataset <- mtcars
class(dataset$mpg)

Resultado

## [1] "numeric"

No todas las columnas numéricas son realmente continuas. En el mismo conjunto de datos, `cyl` contiene solo 4, 6 y 8, y `am` solo 0 y 1, por lo que ambas son categorías que, casualmente, se almacenan como números. Convertirlas con `factor()` antes de modelar evita que R trate el intervalo entre 4 y 6 cilindros como una cantidad medida. El proceso inverso, que consiste en dividir una columna continua en bandas, se realiza con `cut()`.

Niveles y etiquetas de factores en R

El atributo `levels` es la parte del factor que más tiempo le llevará ajustar, ya que controla tanto lo que se imprime como lo que un modelo considera como línea base. Cuatro funciones auxiliares básicas de R cubren casi todos los casos.

Función ¿Qué hace? Uso típico
niveles(f) Lee o reemplaza los nombres de los niveles. Cambiar el nombre de las abreviaturas por etiquetas legibles.
nniveles(f) Devuelve el número de niveles Comprobar que una categoría no explotó después de una unión
relevel(f, ref) Se mueve un nivel hacia adelante. Elegir la línea base para una regresión
niveles de caída(f) Elimina los niveles con cero observaciones. Limpieza después de la selección de subconjuntos o el filtrado.

El bloque que aparece a continuación aplica los cuatro factores de color y género creados 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])

Dos detalles merecen ser recordados. Asignar a levels() renombra por posición, por lo que un vector que no coincide vuelve a etiquetar silenciosamente la categoría incorrecta. Y un subconjunto conserva cada nivel original hasta que se llama a droplevels(), razón por la cual un filtrado marco de datos aún se pueden trazar barras vacías. etiquetas El argumento es diferente de nuevo: nombra los niveles en el momento de su creación, y las etiquetas duplicadas combinan varios valores de entrada en un solo nivel.

Cómo convertir un factor a numérico o carácter en R.

Este es el error más común en los factores de R. Dado que un factor almacena códigos enteros, al llamar a `as.numeric()` se devuelven esos códigos en lugar de los valores que se muestran en pantalla. Un factor de los años 2021 a 2023 devuelve 1, 2 y 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)

La documentación básica de R recomienda `as.numeric(levels(f))[f]` como la ruta correcta y ligeramente más rápida, mientras que `as.numeric(as.character(f))` es el equivalente más fácil de leer. Ambos leen primero la etiqueta y luego la convierten.

  • Factor de carácter: as.character(f) devuelve las etiquetas como texto plano.
  • Factorizar códigos enteros: as.integer(f) o unclass(f) cuando los códigos son lo que realmente deseas.
  • Carácter a factor: factor(x) o el atajo más rápido as.factor(x).
  • De numérico a factor: factor(x) para códigos discretos, cut(x, breaks) para valores continuos que necesitan agrupamiento.

Una medida de seguridad se aplica a todos ellos. Si un valor en x no aparece en el vector levels, factor() establece ese elemento en NA en lugar de generar un error, por lo que un espacio suelto o una diferencia de mayúsculas pueden eliminar filas silenciosamente. Comparar valores únicos antes y después de la conversión, o ordenar el marco de datos En la nueva columna, se expone rápidamente el problema.

Factor vs. Carácter vs. Numérico en R: Cuándo usar cada uno

Seleccionar el modo de almacenamiento con anticipación ahorra mucho trabajo de depuración posterior. La tabla compara los tres modos que puede adoptar una columna de texto o código.

Propiedad Factor Caracter Numérico
Almacenado como Códigos enteros más un atributo de niveles Strings Doubles o números enteros
Conjunto fijo de valores Sí, definido por niveles No No
Pedido de exhibición personalizado Sí, a través de niveles Solo alfabético Solo numérico
Aritmética No se permiten No se permiten Permitido
Contrastes del modelo Construido automáticamente Coaccionados primero Tratado como una medida

Use un factor cuando los valores provienen de una lista conocida y cerrada, cuando el orden de visualización o clasificación importa, o cuando la columna alimenta un modelo o una leyenda de gráfico. personaje para texto libre, identificadores y cualquier cosa que vayas a analizar o unir, como nombres, notas y códigos que siguen llegando con nuevos valores. Utiliza numérico solo cuando la distancia entre dos valores sea significativa.

El recuadro que aparece a continuación muestra las formas más rápidas de comprobar lo que realmente tienes.

# 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)

Dos hábitos mantienen la elección honesta. Ejecuta sapply(df, class) después de cada importación, porque un solo carácter suelto en una columna numérica convierte toda la columna en texto. Y convierte a factor lo más tarde posible, después de que los datos se hayan limpiado y unido, para que dplyr Las uniones y los filtros siguen comparando cadenas simples en lugar de conjuntos de niveles que no coinciden.

Preguntas Frecuentes

Cuando no se especifica el argumento levels, factor() llama a unique() y ordena los valores de forma ascendente. Este ordenamiento depende de la configuración regional activa, por lo que no siempre es ASCII simple. Proporcione el argumento levels explícitamente siempre que el orden sea relevante.

table(f) devuelve un recuento con nombre para cada nivel, y prop.table(table(f)) convierte esos recuentos en proporciones. Ambos mantienen visibles los niveles vacíos, lo que los hace útiles para detectar categorías que desaparecieron después de filtrar un marco de datos.

La función factor() compara cada elemento con los niveles que proporcionaste, y cualquier valor que no coincida se convierte en NA en lugar de generar un error. Verifica setdiff(unique(x), your_levels) antes de la conversión y ten cuidado con los espacios en blanco o las mayúsculas diferentes en los datos de origen.

La función `cut()` divide un vector numérico en los puntos de ruptura especificados y devuelve un factor. Utilice `labels` para identificar las bandas de forma legible y `ordered_result = TRUE` cuando las bandas estén clasificadas. `findInterval()` es una alternativa más rápida cuando solo se necesita el índice del intervalo.

Desde R 4.0.0, la configuración predeterminada de fábrica para data.frame() y read.csv() es stringsAsFactors = FALSE, por lo que las columnas de texto conservan el formato de caracteres. Los scripts antiguos que dependían de la conversión automática ahora deben llamar explícitamente a factor() en las columnas que modelan.

Less que antes. La documentación de referencia de R indica que ahora las cadenas idénticas comparten almacenamiento, por lo que la diferencia es mínima en la mayoría de los casos. Los factores siguen siendo útiles para validar las categorías y para fijar el orden de los niveles utilizados en los modelos y gráficos.

La mayoría de las funciones de modelado aceptan factores directamente y construyen contrastes ficticios automáticamente, mientras que muchas aprendizaje automático Los paquetes esperan una matriz numérica. model.matrix() o la codificación one-hot salvan la brecha, y un factor ordenado puede mantener su clasificación.

Sí. Copiloto de GitHub Funciona en RStudio 2023.09.0 y versiones posteriores, y sugiere autocompletado a partir de los comentarios y el código del archivo abierto. Considere el orden de niveles y el manejo de NA como sugerencias para verificar, no como hechos.

Resumir este post con: