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.

¿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.
