Un factor es una variable categórica con un número finito de valores o niveles. En R los factores se utilizan habitualmente para realizar clasificaciones de los datos, estableciendo su pertenencia a los grupos o categorías determinados por los niveles del factor.
Los factores juegan un papel muy importante en la elaboración de modelos estadísticos. En particular, los modelos lineales pueden dar resultados muy diferentes según que una variable se declare como numérica o como factor.
Los niveles de un factor puede estar codificados como valores numéricos o como caracteres. Independientemente de que el factor sea numérico o carácter, sus valores son siempre almacenados internamente por R como números enteros, con lo que se consigue economizar memoria.
Consideremos el siguiente ejemplo. La variable:
sexo <- c("M", "H", "M", "M", "M", "H", "M", "M", "H", "H")
sexo
## [1] "M" "H" "M" "M" "M" "H" "M" "M" "H" "H"
puede ser considerada un factor, ya que establece para cada sujeto su pertenencia a una de las dos categorías “Hombre”" o “Mujer”. Para que R reconozca al sexo como factor, una vez introducidos los datos utilizamos la función:
sexo <- factor(sexo)
sexo
## [1] M H M M M H M M H H
## Levels: H M
con lo que hemos convertido sexo
en un factor con dos niveles M
y H
. En muchos casos, los niveles del factor son poco ilustrativos de su significado. La siguiente sintaxis especifica explícitamente los niveles del factor (levels
) y asigna etiquetas (labels
) a cada uno de ellos:
sexo <- factor(sexo,levels=c("H","M"),labels=c("Hombre","Mujer"))
sexo
## [1] Mujer Hombre Mujer Mujer Mujer Hombre Mujer Mujer Hombre Hombre
## Levels: Hombre Mujer
Estas etiquetas aparecerán en los resultados de los procedimientos estadísticos donde apareza el factor, aclarando su significado. Por ejemplo, si pedimos a R que nos construya la tabla de frecuencias de sexos, en lugar de H
o M
nos mostrará los términos “Hombre”" o “Mujer”:
table(sexo)
## sexo
## Hombre Mujer
## 4 6
Hay alguna funciones en R que requieren que la variable de entrada sea necesariamente un factor (aún cuando la variable esté codificada numéricamente). Para ello basta recodificar la variable original como factor. Por ejemplo, supongamos que se ha registrado la producción de tres máquinas (identificadas como 27, 32 y 55) durante cinco días sucesivos, dando como resultado los siguientes datos:
produccion=c(120,100,132,112,95,164,172,183,155,176,110,115,122,108,120)
maquina=c(27,27,27,27,27,32,32,32,32,32,55,55,55,55,55)
dia=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
cbind(maquina,dia,produccion)
## maquina dia produccion
## [1,] 27 1 120
## [2,] 27 2 100
## [3,] 27 3 132
## [4,] 27 4 112
## [5,] 27 5 95
## [6,] 32 1 164
## [7,] 32 2 172
## [8,] 32 3 183
## [9,] 32 4 155
## [10,] 32 5 176
## [11,] 55 1 110
## [12,] 55 2 115
## [13,] 55 3 122
## [14,] 55 4 108
## [15,] 55 5 120
Si se pretende evaluar la producción de estas tres máquinas a lo largo de estos días, es evidente que sus números de identificación (27, 32 y 55) son simples etiquetas sin que su valor intrínseco tenga ningún sentido en el problema. En este caso resulta razonable (y, como veremos, en el ajuste de modelos de análisis de la varianza es además necesario) convertir esta variable en factor. Para ello simplemente ejecutamos:
maquina=factor(maquina)
maquina
## [1] 27 27 27 27 27 32 32 32 32 32 55 55 55 55 55
## Levels: 27 32 55
class(maquina)
## [1] "factor"
Un factor puede convertirse en variable numérica mediante la función as.numeric()
. Ahora bien, dichas conversiones deben realizarse con cierta precaución. Así por ejemplo, si en el caso anterior aplicamos la función as.numeric()
al factor maquina obtenemos:
as.numeric(maquina)
## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
¡No se han recuperado los valores originales 27, 32 y 55!. Lo que ocurre en este caso es que R muestra la codificación interna de los niveles del factor (habitualmente valores enteros ordenados desde 1 hasta el número total de niveles). Si quisiéramos recuperar los valores numéricos originales de la variable maquina debemos primero convertirla en carácter, y a continuación en numérica:
as.numeric(as.character(maquina))
## [1] 27 27 27 27 27 32 32 32 32 32 55 55 55 55 55
El mismo resultado puede obtenerse de forma ligeramente más eficiente mediante::
as.numeric(levels(maquina))[maquina]
## [1] 27 27 27 27 27 32 32 32 32 32 55 55 55 55 55
Supongamos que leemos la siguiente variable, que corresponde al nivel de cierto contaminante en 10 muestras de agua:
pct <- c("alto","bajo","bajo","medio","alto","medio","bajo","alto","alto","alto")
Si la convertimos en factor y obtenemos una tabla de frecuencias de sus valores:
fpct=factor(pct)
table(fpct)
## fpct
## alto bajo medio
## 5 3 2
podemos comprobar que la ordenación de los valores en la tabla es simplemente alfabética. La codificación numérica que ha realizado R de los niveles del factor es:
as.numeric(fpct)
## [1] 1 2 2 3 1 3 2 1 1 1
correspondiente al orden alfabético. Ahora bien, si nos interesara que en la tabla de frecuencias los valores estuviesen ordenados, primero el nivel bajo, luego el medio y por último el alto, debemos especificar esta ordenación en la definición del factor:
fpct=factor(pct, levels=c("bajo","medio","alto"))
table(fpct)
## fpct
## bajo medio alto
## 3 2 5
Podemos comprobar que la codificación numérica ahora es distinta:
as.numeric(fpct)
## [1] 3 1 1 2 3 2 1 3 3 3
© 2016 Angelo Santana, Carmen N. Hernández, Departamento de Matemáticas ULPGC