Uno de los tipos de datos básicos en R son los factores. En mi experiencia, los factores son básicamente un dolor y nunca los uso. Siempre me convierto en personajes. Extrañamente siento que me estoy perdiendo algo.
¿Hay algunos ejemplos importantes de funciones que usan factores como variables de agrupación donde el tipo de datos de factor se vuelve necesario? ¿Existen circunstancias específicas en las que debería utilizar factores?
r
language-design
internals
r-factor
JD Long
fuente
fuente
Respuestas:
Deberías usar factores. Sí, pueden ser una molestia, pero mi teoría es que el 90% de por qué son una molestia se debe a que en
read.table
yread.csv
, el argumentostringsAsFactors = TRUE
por defecto (y la mayoría de los usuarios pierden esta sutileza). Digo que son útiles porque los paquetes de ajuste de modelos como lme4 usan factores y factores ordenados para ajustar de manera diferencial los modelos y determinar el tipo de contrastes a utilizar. Y los paquetes de gráficos también los usan para agrupar.ggplot
y la mayoría de las funciones de ajuste de modelos coaccionan vectores de caracteres a factores, por lo que el resultado es el mismo. Sin embargo, terminas con advertencias en tu código:Una cosa complicada es todo
drop=TRUE
. En vectores, esto funciona bien para eliminar niveles de factores que no están en los datos. Por ejemplo:Sin embargo , con
data.frame
s, el comportamiento de[.data.frame()
es diferente: vea este correo electrónico o?"[.data.frame"
. Usardrop=TRUE
endata.frame
s no funciona como te imaginas:Afortunadamente, puede eliminar factores fácilmente
droplevels()
para eliminar los niveles de factor no utilizados para un factor individual o para cada factor en adata.frame
(desde R 2.12):Así es como evitar que los niveles seleccionados entren en
ggplot
leyendas.Internamente,
factor
s son números enteros con un vector de caracteres de nivel de atributo (verattributes(iris$Species)
yclass(attributes(iris$Species)$levels)
), que es limpio. Si tuviera que cambiar el nombre de un nivel (y estuviera usando cadenas de caracteres), esta sería una operación mucho menos eficiente. Y cambio mucho los nombres de los niveles, especialmente para lasggplot
leyendas. Si falsifica factores con vectores de caracteres, existe el riesgo de que cambie solo un elemento y cree accidentalmente un nuevo nivel separado.fuente
stringsAsFactors
no es una función.Los factores ordenados son increíbles, si me encantan las naranjas y odio las manzanas, pero no me importan las uvas, no necesito administrar un índice extraño para decirlo:
fuente
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
? Habría adivinado que los ordenó en el marco de datos, pero después de ejecutar esa línea e imprimir el marco de datos, nada cambia. ¿Impone simplemente un orden interno aunque el orden impreso no cambie?A
factor
es muy análogo a un tipo enumerado en otros idiomas. Su uso apropiado es para una variable que solo puede tomar uno de los conjuntos de valores prescritos. En estos casos, no todos los posibles valores permitidos pueden estar presentes en un conjunto particular de datos y los niveles "vacíos" lo reflejan con precisión.Considere algunos ejemplos. Para algunos datos que se recopilaron en todo Estados Unidos, el estado debe registrarse como un factor. En este caso, el hecho de que no se recopilaron casos de un estado en particular es relevante. Podría haber datos de ese estado, pero sucedió (por cualquier motivo, que puede ser un motivo de interés) que no los hubo. Si se recogiera la ciudad natal, no sería un factor. No hay un conjunto preestablecido de posibles lugares de origen. Si los datos se recopilaran de tres ciudades en lugar de a nivel nacional, la ciudad sería un factor: hay tres opciones que se dieron al principio y si no se encontraron casos / datos relevantes en una de esas tres ciudades, eso es relevante.
Otros aspectos de
factor
s, como proporcionar una forma de dar un orden de clasificación arbitrario a un conjunto de cadenas, son características secundarias útiles defactor
s, pero no son la razón de su existencia.fuente
Los factores son fantásticos cuando uno está haciendo análisis estadístico y explorando los datos. Sin embargo, antes de eso, cuando uno está leyendo, limpiando, solucionando problemas, fusionando y generalmente manipulando los datos, los factores son un dolor total. Más recientemente, como en los últimos años, muchas de las funciones han mejorado para manejar mejor los factores. Por ejemplo, rbind juega muy bien con ellos. Todavía me resulta una molestia total haber dejado niveles vacíos después de una función de subconjunto.
Sé que es sencillo recodificar los niveles de un factor y reajustar las etiquetas y también hay formas maravillosas de reordenar los niveles. Mi cerebro simplemente no puede recordarlos y tengo que volver a aprenderlos cada vez que lo uso. La recodificación debería ser mucho más fácil de lo que es.
Las funciones de cadena de R son bastante fáciles y lógicas de usar. Entonces, cuando manipulo, generalmente prefiero los personajes a los factores.
fuente
droplevels()
. Y no reordena los factores por defecto.¡Qué título sarcástico!
Creo que muchas funciones de estimación te permiten usar factores para definir fácilmente variables ficticias ... pero no las uso para eso.
Los uso cuando tengo vectores de caracteres muy grandes con pocas observaciones únicas. Esto puede reducir el consumo de memoria, especialmente si las cadenas del vector de caracteres son más largas.
PD: estoy bromeando sobre el título. Vi tu tweet. ;-)
fuente
?factor
era R-2.6.0 y dice: "Los valores enteros se almacenan en 4 bytes, mientras que cada referencia a una cadena de caracteres necesita un puntero de 4 u 8 bytes". ¿Ahorraría espacio convirtiendo a factor si la cadena de caracteres necesita 8 bytes?N=100000
tengo 391,5 Kb frente a 391,8 Kb. Entonces, el factor requiere poca más memoria.Los factores son un excelente motor de identificación de "casos únicos". He recreado esto mal muchas veces, y a pesar de un par de arrugas ocasionalmente, son extremadamente poderosas.
Si hay una mejor manera de hacer esta tarea, me encantaría verla, no veo esta capacidad de
factor
discutir.fuente
La aplicación (y la agregación ) dependen de factores. La relación entre información y esfuerzo de estas funciones es muy alta.
Por ejemplo, en una sola línea de código (la llamada para aplicar a continuación) puede obtener el precio medio de los diamantes por corte y color:
fuente