HOWTO · R
Convertir un factor a valores numéricos en R
Aprenda a convertir factores de R en etiquetas numéricas de forma segura, distinguir los códigos de los valores y tratar etiquetas no válidas.
En esta página
Use as.numeric(as.character(f)) cuando un factor f contenga etiquetas numéricas y necesite obtenerlas como números. En cambio, llamar directamente a as.numeric(f) devuelve los códigos enteros internos del factor. La conversión directa solo es útil cuando esos códigos se emplean deliberadamente como identificadores de categorías.
Comprender qué devuelve as.numeric para un factor
Los factores de R contienen códigos enteros y un conjunto independiente de niveles de caracteres. Los códigos apuntan a los niveles según su orden alfabético o el orden indicado de forma explícita; no son necesariamente las mediciones originales. Puede examinar ambas partes con levels() y unclass().
La salida de as.numeric(f) es una secuencia de códigos como 2 1 2 3. Esto no significa que los valores originales fueran 2, 1, 2 y 3. La distinción es importante cuando un marco de datos importa como factor una columna que parece numérica.
Convertir etiquetas numéricas de un factor en números
Convierta primero el factor en caracteres y después sus etiquetas en valores numéricos:
f <- factor(c("3", "2", "3", "4"))
values <- as.numeric(as.character(f))
values
Para un factor cuyos niveles sean numéricos, as.numeric(levels(f))[f] es una alternativa eficiente. Ambos métodos recuperan las etiquetas, no los códigos internos. La conversión primero a caracteres suele ser más legible y deja explícitos los dos pasos.
Las etiquetas numéricas decimales y negativas funcionan de la misma manera. Realice la conversión cerca del paso de importación o limpieza y compruebe el resultado con str() o class() antes de usarlo en cálculos.
Codificar etiquetas categóricas de forma intencionada
Si las etiquetas son categorías, no trate sus códigos como mediciones. Defina expresamente el orden de las categorías cuando necesite un identificador estable:
grade <- factor(c("low", "high", "low"), levels = c("low", "high"))
codes <- as.numeric(grade)
codes
Aquí, 1 y 2 son códigos de categoría porque el orden se eligió de forma explícita. No indican que high sea el doble de low. Para una correspondencia específica del negocio o del modelo, una tabla de búsqueda con nombres es más clara:
grade <- c("low", "high", "low")
score <- c(low = 10, high = 20)[grade]
score
Así queda visible el significado de cada valor numérico y se evita depender del orden predeterminado de los niveles del factor.
Tratar etiquetas no numéricas, valores ausentes y advertencias
La conversión mediante caracteres no puede transformar etiquetas arbitrarias en números. El texto no numérico se convierte en NA y R emite una advertencia de coerción; un valor que ya estaba ausente sigue ausente:
f <- factor(c("12.5", "oops", NA))
values <- as.numeric(as.character(f))
values
is.na(values)
Considere los valores NA inesperados como una señal de problemas de calidad de los datos. Revise las etiquetas originales, recorte o normalice los espacios cuando corresponda y decida cómo tratar los registros no válidos antes del análisis. No los sustituya silenciosamente por cero. Si las etiquetas son categóricas y no numéricas, use una correspondencia explícita o un factor con un orden definido.
Verificar la conversión
Antes de confiar en el resultado, compruebe la clase de origen, los niveles, los valores convertidos y cualquier advertencia. La regla resumida es:
- use
as.numeric(f)para códigos de factor intencionados; - use
as.numeric(as.character(f))para etiquetas numéricas; - use un orden explícito o una correspondencia con nombres para las categorías; y
- examine los valores
NAdespués de convertir texto importado.
El código R moderno debe especificar deliberadamente los tipos de importación o los niveles del factor, en vez de depender de valores predeterminados históricos sobre la conversión de cadenas en factores. Estas comprobaciones aclaran el significado previsto de cada resultado numérico.