column - reshape2 mensaje de advertencia de fusión
columns to rows r (2)
Una explicación:
Cuando se derrite, está combinando varias columnas en una sola. En este caso, está combinando columnas de factores, cada una de las cuales tiene un atributo de levels
. Estos niveles no son los mismos en todas las columnas porque sus factores son realmente diferentes. melt
simplemente coacciona cada factor a carácter y deja caer sus atributos al crear la columna de value
en el resultado.
En este caso, la advertencia no importa, pero debe tener mucho cuidado al combinar columnas que no son del mismo "tipo", donde "tipo" no significa solo tipo de vector, sino genéricamente la naturaleza de las cosas a las que se refiere. . Por ejemplo, no me gustaría derretir una columna que contenga velocidades en MPH con una que contenga pesos en LB.
Una forma de confirmar que está bien combinar las columnas de factores es preguntarse si un posible valor en una columna sería un valor razonable en cada otra columna. Si ese es el caso, entonces lo más probable es asegurarse de que cada columna de factores tenga todos los niveles posibles que podría aceptar (en el mismo orden). Si haces esto, no recibirás una advertencia cuando derritas la mesa.
Una ilustración:
library(reshape2)
DF <- data.frame(id=1:3, x=letters[1:3], y=rev(letters)[1:3])
str(DF)
Los niveles para x
no son los mismos:
''data.frame'': 3 obs. of 3 variables:
$ id: int 1 2 3
$ x : Factor w/ 3 levels "a","b","c": 1 2 3
$ y : Factor w/ 3 levels "x","y","z": 3 2 1
Aquí nos melt
y miramos en la columna y
se fundieron en ( value
):
melt(DF, id.vars="id")$value
Obtenemos un vector de caracteres y una advertencia:
[1] "a" "b" "c" "z" "y" "x"
Warning message:
attributes are not identical across measure variables; they will be dropped
Sin embargo, si restablecemos los factores para tener los mismos niveles y solo luego se derriten:
DF[2:3] <- lapply(DF[2:3], factor, levels=letters)
melt(DF, id.vars="id", factorsAsStrings=F)$value
Obtenemos el factor correcto y sin advertencias:
[1] a b c z y x
Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
El comportamiento predeterminado de melt
es bajar los niveles de factor incluso cuando son idénticos, por lo que usamos factorsAsStrings=F
arriba. Si no hubiera utilizado esa configuración, habría obtenido un vector de caracteres, pero sin advertencia. Yo diría que el comportamiento predeterminado debería ser mantener el resultado como un factor, pero ese no es el caso aquí.
Estoy usando melt
y encuentro el siguiente mensaje de advertencia:
attributes are not identical across measure variables; they will be dropped
Después de mirar alrededor, las personas han mencionado que se debe a que las variables son clases diferentes; sin embargo, ese no es el caso con mi conjunto de datos.
Aquí está el conjunto de datos:
test <- structure(list(park = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = c("miss", "piro", "sacn", "slbe"), class = "factor"),
a1.one = structure(c(3L, 1L, 3L, 3L, 3L, 3L, 1L, 3L, 3L,
3L), .Label = c("agriculture", "beaver", "development", "flooding",
"forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90",
"none"), class = "factor"), a2.one = structure(c(6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = c("development",
"forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90",
"none"), class = "factor"), a3.one = structure(c(3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("forest_pathogen",
"harvest_00_20", "none"), class = "factor"), a1.two = structure(c(3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("agriculture",
"beaver", "development", "flooding", "forest_pathogen", "harvest_00_20",
"harvest_30_60", "harvest_70_90", "none"), class = "factor"),
a2.two = structure(c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L), .Label = c("development", "forest_pathogen", "harvest_00_20",
"harvest_30_60", "harvest_70_90", "none"), class = "factor"),
a3.two = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L), .Label = c("forest_pathogen", "harvest_00_20", "none"
), class = "factor")), .Names = c("park", "a1.one", "a2.one",
"a3.one", "a1.two", "a2.two", "a3.two"), row.names = c(NA, 10L
), class = "data.frame")
Y aquí está la estructura:
str(test)
''data.frame'': 10 obs. of 7 variables:
$ park : Factor w/ 4 levels "miss","piro",..: 1 1 1 1 1 1 1 1 1 1
$ a1.one: Factor w/ 9 levels "agriculture",..: 3 1 3 3 3 3 1 3 3 3
$ a2.one: Factor w/ 6 levels "development",..: 6 6 6 6 6 6 6 6 6 6
$ a3.one: Factor w/ 3 levels "forest_pathogen",..: 3 3 3 3 3 3 3 3 3 3
$ a1.two: Factor w/ 9 levels "agriculture",..: 3 3 3 3 3 3 3 3 3 3
$ a2.two: Factor w/ 6 levels "development",..: 6 6 6 6 6 6 6 6 6 6
$ a3.two: Factor w/ 3 levels "forest_pathogen",..: 3 3 3 3 3 3 3 3 3 3
¿Es porque la cantidad de niveles es diferente para cada variable? Entonces, ¿puedo simplemente ignorar el mensaje de advertencia en este caso?
Para generar el mensaje de advertencia:
library(reshape2)
test.m <- melt (test,id.vars=c(''park''))
Warning message:
attributes are not identical across measure variables; they will be dropped
Gracias.
La respuesta de BrodieG es excelente; sin embargo, hay algunos casos donde no es práctico refactorizar las columnas (por ejemplo, los datos climáticos GHCN con 128 columnas de ancho fijo que quería derretir en un número mucho más pequeño de columnas).
En ese caso, la solución más simple es tratar los datos como caracteres en lugar de factores: por ejemplo, puede volver a importar los datos usando read.fwf(filename,stringsAsFactors=FALSE)
(la misma idea funcionaría para read.csv
) . Para un número menor de columnas, puede convertir factores en cadenas usando d$mystring<-as.character(d$myfactor)
.