variable numerica medicina factor estadistica convertir convert r levels factors

numerica - ¿Por qué la terminología de etiquetas y niveles en factores es tan extraña?



factor to numeric r (2)

Un ejemplo de una función no configurable serían las labels . Solo puede establecer etiquetas de factor cuando se crean con la función factor. No hay labels<- función. No es que las "etiquetas" y los "niveles" en los factores tengan sentido ...

> fac <- factor(1:3, labels=c("one", "two", "three")) > fac [1] one two three Levels: one two three > labels(fac) [1] "1" "2" "3"

De acuerdo, pedí las etiquetas, que uno podría suponer que fueron establecidas por la llamada al factor, pero obtengo algo bastante ... ¿cuál es la palabra, poco intuitiva?

> levels(fac) [1] "one" "two" "three"

Entonces parece que establecer etiquetas realmente está configurando niveles.

> fac <- factor(1:3, levels=c("one", "two", "three")) > levels(fac) [1] "one" "two" "three"

OK, eso es lo esperado. Entonces, ¿qué son las etiquetas cuando uno establece niveles?

> fac <- factor(1:3, levels=c("one", "two", "three"), labels=c("x","y", "z") ) > labels(fac) [1] "1" "2" "3" > levels(fac) [1] "x" "y" "z"

Effing extraño, si me preguntas. Parecería que los argumentos de ''etiquetas'' para factor prevalecen sobre cualquier argumento de ''niveles'' para la especificación de niveles. ¿Por qué debería ser esto? Parece una terminología confusa. ¿Y por qué las labels() devuelven lo que yo hubiera imaginado para ser recuperado con as.character (as.numeric (fac))?

(Este fue un comentario tangencial [etiquetado como tal] en una respuesta anterior sobre las funciones de asignación a las que se me pidió que pasara a una pregunta. Así que esta es su oportunidad para aclararme).


Creo que la forma de pensar sobre la diferencia entre labels y levels (ignorando la función de labels() que Tommy describe en su respuesta) es que los levels están destinados a decirle a R qué valores buscar en la entrada ( x ) y qué orden usar en los niveles del objeto factor resultante, y labels es cambiar los valores de los niveles después de que la entrada se haya codificado como un factor ... como sugiere la respuesta de Tommy, no hay parte del factor objeto devuelto por el factor() que se llama labels ... solo los niveles, que han sido ajustados por el argumento de las labels ... (claro como el barro).

Por ejemplo:

> f <- factor(x=c("a","b","c"),levels=c("c","d","e")) > f [1] <NA> <NA> c Levels: c d e > str(f) Factor w/ 3 levels "c","d","e": NA NA 1

Debido a que los primeros dos elementos de x no se encontraron en levels , los primeros dos elementos de f son NA . Debido a que "d" y "e" se incluyeron en los levels , aparecen en los niveles de f aunque no ocurrieron en x .

Ahora con labels :

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("C","D","E")) > f [1] <NA> <NA> C Levels: C D E

Después de que R averigüe qué debería ser en el factor, vuelve a codificar los niveles. Por supuesto, uno puede usar esto para hacer cosas para freír el cerebro, tales como:

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("a","b","c")) > f [1] <NA> <NA> a Levels: a b c

Otra forma de pensar acerca de los levels es que el factor(x,levels=L1,labels=L2) es equivalente a

f <- factor(x,levels=L1) levels(f) <- L2

Creo que una versión apropiadamente redactada de este ejemplo podría ser buena para el infierno R de Pat Burns: hay muchos acertijos de factores en la sección 8.2, pero no este en particular ...


La función de labels suena como el ajuste perfecto para obtener las etiquetas de un factor.

... pero la función de labels no tiene nada que ver con los factores! Se utiliza como una forma genérica de obtener algo para "etiquetar" un objeto. Para los vectores atómicos, estos serían los nombres. Pero si no hay nombres, la función de labels devuelve los índices de elemento forzados a cadenas, algo así como as.character(seq_along(x)) .

... Así que eso es lo que ves cuando pruebas las etiquetas en un factor. El factor es un vector entero sin ningún nombre, pero con un atributo de levels .

Un factor no tiene etiquetas. Solo tiene niveles. El argumento de labels a factor es solo una forma de poder dar un conjunto de cadenas pero producir otro conjunto de cadenas como los niveles ... Pero para confundir aún más las cosas, la función dput imprime los atributos de levels como .Label ! Creo que eso es un legado ...

# Translate lower case letters to upper case. f <- factor(letters[2:4], letters[1:3], LETTERS[1:3]) dput(f) #structure(c(2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor") attributes(f) #$levels #[1] "A" "B" "C" # #$class #[1] "factor"

Sin embargo, dado que las labels son una función genérica, probablemente sería una buena idea definir labels.factor siguiente manera (actualmente no hay ninguna). Tal vez algo para R core considerar?

labels.factor <- function(x, ...) as.character(x)