Looking for r Answers? Try Ask4KnowledgeBase
Looking for r Keywords? Try Ask4Keywords

R LanguageFactores


Sintaxis

  1. factor (x = carácter (), niveles, etiquetas = niveles, excluir = NA, ordenado = ordenado (x), nmax = NA)
  2. Ejecutar el ?factor o ver la documentación en línea.

Observaciones

Un objeto con factor clase es un vector con un conjunto particular de características.

  1. Se almacena internamente como un vector integer .
  2. Mantiene un atributo de levels muestra la representación de caracteres de los valores.
  3. Su clase se almacena como factor

Para ilustrar, generemos un vector de 1,000 observaciones de un conjunto de colores.

set.seed(1)
Color <- sample(x = c("Red", "Blue", "Green", "Yellow"), 
                size = 1000, 
                replace = TRUE)
Color <- factor(Color)

Podemos observar cada una de las características de Color enumeradas anteriormente:

#* 1. It is stored internally as an `integer` vector
typeof(Color)
[1] "integer"
#* 2. It maintains a `levels` attribute the shows the character representation of the values.
#* 3. Its class is stored as `factor`
attributes(Color)
$levels
[1] "Blue"   "Green"  "Red"    "Yellow"

$class
[1] "factor"

La principal ventaja de un objeto factorial es la eficiencia en el almacenamiento de datos. Un entero requiere menos memoria para almacenar que un carácter. Dicha eficiencia era altamente deseable cuando muchas computadoras tenían recursos mucho más limitados que las máquinas actuales (para una historia más detallada de las motivaciones detrás de los factores de uso, vea stringsAsFactors : una biografía no autorizada ). La diferencia en el uso de la memoria se puede ver incluso en nuestro objeto Color . Como puede ver, el almacenamiento de Color como un carácter requiere aproximadamente 1,7 veces más memoria que el objeto factor.

#* Amount of memory required to store Color as a factor.
object.size(Color)
4624 bytes
#* Amount of memory required to store Color as a character
object.size(as.character(Color))
8232 bytes

Mapeo del entero al nivel

Mientras que el cálculo interno de los factores ve el objeto como un entero, la representación deseada para el consumo humano es el nivel de carácter. Por ejemplo,

head(Color)
[1] Blue   Blue   Green  Yellow Red    Yellow  
Levels: Blue Green Red Yellow

Es más fácil para la comprensión humana que

head(as.numeric(Color))
[1] 1 1 2 4 3 4

Una ilustración aproximada de cómo R va haciendo coincidir la representación de caracteres con el valor entero interno es:

head(levels(Color)[as.numeric(Color)])
[1] "Blue"   "Blue"   "Green"  "Yellow" "Red"    "Yellow"

Compara estos resultados con

head(Color)
[1] Blue   Blue   Green  Yellow Red    Yellow  
Levels: Blue Green Red Yellow

Uso moderno de los factores.

En 2007, R introdujo un método de hashing para caracteres que reducía la carga de memoria de los vectores de caracteres (ref: stringsAsFactors : una biografía no autorizada ). Tenga en cuenta que cuando determinamos que los caracteres requieren 1.7 veces más espacio de almacenamiento que los factores, eso se calculó en una versión reciente de R, lo que significa que el uso de la memoria de los vectores de caracteres fue aún más exigente antes de 2007.

Debido al método hash en la R moderna y a recursos de memoria mucho mayores en las computadoras modernas, el problema de la eficiencia de la memoria en el almacenamiento de valores de caracteres se ha reducido a una preocupación muy pequeña. La actitud predominante en la comunidad R es una preferencia por los vectores de caracteres sobre los factores en la mayoría de las situaciones. Las causas principales para el alejamiento de los factores son

  1. El aumento de datos de caracteres no estructurados y / o poco controlados.
  2. La tendencia de los factores a no comportarse como se desea cuando el usuario olvida que está tratando con un factor y no con un personaje.

En el primer caso, no tiene sentido almacenar texto libre o campos de respuesta abiertos como factores, ya que es poco probable que haya algún patrón que permita más de una observación por nivel. Alternativamente, si la estructura de datos no se controla cuidadosamente, es posible obtener múltiples niveles que se correspondan con la misma categoría (como "azul", "azul" y "AZUL"). En tales casos, muchos prefieren administrar estas discrepancias como caracteres antes de convertirse en un factor (si la conversión se lleva a cabo).

En el segundo caso, si el usuario piensa que está trabajando con un vector de caracteres, es posible que ciertos métodos no respondan según lo previsto. Esta comprensión básica puede generar confusión y frustración al intentar depurar scripts y códigos. Mientras que, estrictamente hablando, esto puede ser considerado culpa del usuario, la mayoría de los usuarios están felices de evitar el uso de factores y evitar estas situaciones por completo.

Factores Ejemplos relacionados