Confusión entre niveles de factores y tags de factores

Parece que hay una diferencia entre los niveles y las tags de un factor en R. Hasta ahora, siempre pensé que los niveles eran el nombre “real” de los niveles de los factores, y las tags eran los nombres utilizados para la salida (como tablas y gráficos) . Obviamente, este no es el caso, como muestra el siguiente ejemplo:

df <- data.frame(v=c(1,2,3),f=c('a','b','c')) str(df) 'data.frame': 3 obs. of 2 variables: $ v: num 1 2 3 $ f: Factor w/ 3 levels "a","b","c": 1 2 3 df$f <- factor(df$f, levels=c('a','b','c'), labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX')) levels(df$f) [1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX" 

Pensé que los niveles (‘a’, ‘b’, ‘c’) podrían ser accedidos de alguna manera al hacer scripts, pero esto no funciona:

 > df$f=='a' [1] FALSE FALSE FALSE 

Pero esto hace:

 > df$f=='Treatment A: XYZ' [1] TRUE FALSE FALSE 

Entonces, mi pregunta consiste de dos partes:

  • ¿Cuál es la diferencia entre niveles y tags?

  • ¿Es posible tener diferentes nombres para niveles de factor para scripting y output?

Antecedentes: para secuencias de comandos más largas, la creación de scripts con niveles de factor cortos parece ser mucho más fácil. Sin embargo, para informes y plots, estos niveles de factores cortos pueden no ser adecuados y deben reemplazarse con nombres precisos.

Muy corto: los niveles son la entrada, las tags son la salida en la función factor() . Un factor tiene solo un atributo de level , que se establece mediante el argumento labels en la función factor() . Esto es diferente del concepto de tags en paquetes estadísticos como SPSS, y puede ser confuso al principio.

Qué haces en esta línea de código

 df$f <- factor(df$f, levels=c('a','b','c'), labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX')) 

le está diciendo a R que hay un vector df$f

  • que quieres transformar en un factor,
  • en el cual los diferentes niveles están codificados como a, b y c
  • y para los que desea que los niveles se etiqueten como Tratamiento A, etc.

La función de factor buscará los valores a, byc, los convertirá en clases de factores numéricos y agregará los valores de etiqueta al atributo de level del factor. Este atributo se usa para convertir los valores numéricos internos a las tags correctas. Pero como ve, no hay ningún atributo de label .

 > df <- data.frame(v=c(1,2,3),f=c('a','b','c')) > attributes(df$f) $levels [1] "a" "b" "c" $class [1] "factor" > df$f <- factor(df$f, levels=c('a','b','c'), + labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX')) > attributes(df$f) $levels [1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX" $class [1] "factor" 

Escribí un paquete “lfactors” que le permite consultar niveles o tags.

 # packages install.packages("lfactors") require(lfactors) flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads")) # Tails can now be referred to as, "Tails" or 0 # These two lines return the same result flips == "Tails" #[1] TRUE FALSE FALSE TRUE TRUE FALSE flips == 0 #[1] TRUE FALSE FALSE TRUE TRUE FALSE 

Tenga en cuenta que un lfactor requiere que los niveles sean numéricos para que no puedan confundirse con las tags.

    Intereting Posts