Construye manualmente el factor a partir de un vector de enteros.
Estoy tratando de entender cómo varios objetos en R están compuestos por vectores atómicos y genéricos.
Se puede construir un data.frame
a partir de una list
estableciendo manualmente los atributos names
, row.names
y class
, ver aquí.
Me pregunto cómo podría funcionar esto para factores, que se representan internamente como vectores enteros. La solución que se me ocurrió es la siguiente:
R
f <- 1:3
class(f) <- "factor"
levels(f) <- c("low", "medium", "high")
Warning message:
In str.default(val) : 'object' does not have valid levels()
Pero por alguna razón, esto sigue luciendo diferente a un factor correctamente construido:
R
str(unclass(f))
int [1:3] 1 2 3
- attr(*, "levels")= chr [1:3] "low" "medium" "high"
str(unclass(factor(c("low", "medium", "high"))))
int [1:3] 2 3 1
- attr(*, "levels")= chr [1:3] "high" "low" "medium"
¿Me estoy perdiendo algo? (Sé que esto probablemente no debería usarse en código de producción, en cambio, es solo con fines educativos).
davy.ai
Es posible construir un factor a partir de un vector estableciendo manualmente los atributos de clase y niveles. Sin embargo, este método puede generar advertencias y el factor resultante puede parecer diferente en comparación con un factor correctamente construido.
En el ejemplo proporcionado, el vector
f
primero se le asigna la clase “factor” y luego se establece su atributo de niveles en “low”, “medium” y “high”. Sin embargo, se emite una advertencia que indica que el objeto no tiene niveles válidos. Cuandof
se desclasa y se examina su estructura, aparece como un vector de enteros con un atributo de niveles.Comparando esto con un factor correctamente construido utilizando el vector de niveles “low”, “medium” y “high”, vemos que el vector de enteros resultante y el atributo de niveles tienen un orden diferente.
En general, aunque establecer manualmente los atributos puede construir técnicamente un factor, puede que no sea confiable y no se debe utilizar en código de producción.