2012-06-07 8 views
17

Quería crear una barra de barras en la que las barras se ordenaran por altura en lugar de alfabéticamente por categoría. Esto funcionó bien cuando el único paquete que cargué fue ggplot2. Sin embargo, cuando cargué algunos paquetes más y ejecuté el mismo código que creó, ordenó y trazó mi marco de datos, las barras volvieron a ordenarse alfabéticamente de nuevo.El factor de reordenación arroja resultados diferentes, dependiendo de qué paquetes están cargados

Comprobé el marco de datos cada vez usando str() y resultó que los atributos del marco de datos ahora eran diferentes, aunque siempre ejecutaba el mismo código.

Mi código y resultados se enumeran a continuación. ¿Alguien puede explicar el comportamiento diferente? ¿Por qué cargar algunos paquetes aparentemente no relacionados (no relacionados en el sentido de que ninguna de las funciones que estoy usando parecen estar enmascaradas por los paquetes recién cargados) cambia el resultado de ejecutar la función transform()?

Caso 1: Sólo ggplot2 cargado

library(ggplot2) 

group = c("C","F","D","B","A","E") 
num = c(12,11,7,7,2,1) 
data = data.frame(group,num) 
data1 = transform(data, group=reorder(group,-num)) 

> str(data1) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "C","F","B","D",..: 1 2 4 3 5 6 
    ..- attr(*, "scores")= num [1:6(1d)] -2 -7 -12 -7 -1 -11 
    .. ..- attr(*, "dimnames")=List of 1 
    .. .. ..$ : chr "A" "B" "C" "D" ... 
$ num : num 12 11 7 7 2 1 

Caso 2: Cargar varios paquetes más, a continuación, ejecutar el mismo código de nuevo

library(plyr) 
library(xtable) 
library(Hmisc) 
library(gmodels) 
library(reshape2) 
library(vcd) 
library(lattice) 

group = c("C","F","D","B","A","E") 
num = c(12,11,7,7,2,1) 
data = data.frame(group,num) 
data1 = transform(data, group=reorder(group,-num)) 

> str(data1) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "A","B","C","D",..: 3 6 4 2 1 5 
$ num : num 12 11 7 7 2 1 

ACTUALIZACIÓN: SessionInfo()

Caso 1: Ran sessionInfo() después de cargar ggplot2

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
    [1] C/en_US.UTF-8/C/C/C/C 

attached base packages: 
    [1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
    [1] ggplot2_0.9.1 

loaded via a namespace (and not attached): 
    [1] MASS_7.3-18  RColorBrewer_1.0-5 colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  grid_2.15.0  
[7] labeling_0.1  memoise_0.1  munsell_0.3  plyr_1.7.1   proto_0.3-9.2  reshape2_1.2.1  
[13] scales_0.2.1  stringr_0.6  tools_2.15.0 

Caso 2: Ran sessionInfo() después de cargar los paquetes adicionales

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
    [1] C/en_US.UTF-8/C/C/C/C 

attached base packages: 
    [1] grid  splines stats  graphics grDevices utils  datasets methods base  

other attached packages: 
    [1] lattice_0.20-6 vcd_1.2-13  colorspace_1.1-1 MASS_7.3-18  reshape2_1.2.1 gmodels_2.15.2 
[7] Hmisc_3.9-3  survival_2.36-14 xtable_1.7-0  plyr_1.7.1  ggplot2_0.9.1 

loaded via a namespace (and not attached): 
    [1] RColorBrewer_1.0-5 cluster_1.14.2  dichromat_1.2-4 digest_0.5.2  gdata_2.8.2  gtools_2.6.2  
[7] labeling_0.1  memoise_0.1  munsell_0.3  proto_0.3-9.2  scales_0.2.1  stringr_0.6  
[13] tools_2.15.0 
+0

Podría dar la salida de 'sessionInfo()'?Si alguien puede ayudar, pueden tener que coincidir con su R y las versiones del paquete para replicar esto. – joran

+0

Puedo replicar esto en R 2.15.0 con los paquetes actualizados de CRAN (en Ubuntu) – Justin

+1

Muy interesante. Parece que el cambio en los resultados de 'transform()' solo aparece después de cargar 'gmodels' (y no se soluciona al desconectar' gmodels'). Estoy intrigado ... (FWIW, estoy en Windows XP, ejecutando R-devel, por lo que parece que esto no es un problema específico de la versión del sistema operativo o). –

Respuesta

13

Esto sucede porque:

  1. gmodels importaciones gdata
  2. gdata crea un nuevo método para reorder.factor

Comience una sesión limpia. Entonces:

methods("reorder") 
[1] reorder.default* reorder.dendrogram* 

Ahora carga gdata (o cargar gmodels, que tiene el mismo efecto):

library(gdata) 
methods("reorder") 
[1] reorder.default* reorder.dendrogram* reorder.factor 

Aviso no hay enmascaramiento, ya reorder.factor no existe en la base

Recreate el problema, pero esta vez llama explícitamente a los diferentes paquetes:

group = c("C","F","D","B","A","E") 
num = c(12,11,7,7,2,1) 
data = data.frame(group,num) 

La versión R de base (usando reorder.default):

str(transform(data, group=stats:::reorder.default(group,-num))) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "C","F","B","D",..: 1 2 4 3 5 6 
    ..- attr(*, "scores")= num [1:6(1d)] -2 -7 -12 -7 -1 -11 
    .. ..- attr(*, "dimnames")=List of 1 
    .. .. ..$ : chr "A" "B" "C" "D" ... 
$ num : num 12 11 7 7 2 1 

La versión gdata (usando reorder.factor):

str(transform(data, group=gdata:::reorder.factor(group,-num))) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "A","B","C","D",..: 3 6 4 2 1 5 
$ num : num 12 11 7 7 2 1 
+4

Puede obtener el orden "esperado" utilizando la versión 'gdata :: reorder.factor' agregando un argumento' FUN = identity': 'data1 = transform (data, group = reorder (group, -num, FUN = identity)) '. –

+2

Solo para asegurarme de que entiendo la lección aquí: Cuando carga un paquete, puede obtener un comportamiento diferente con el mismo código exacto, incluso en ausencia de enmascaramiento, si el nuevo paquete tiene un método específico para su objeto (en este caso 'reorder.factor'), que" anula "el comportamiento del método de nivel" superior "(en este caso,' reorden' genérico') que de otro modo se aplicaría a su objeto. ¿Es eso correcto? – eipi10

+1

@ eipi10 Sí, su ejemplo lo ilustra claramente. Pedantería sobre la terminología: 'reorder.factor' se envía en lugar de' reorder.default' (por lo tanto, en cierto modo, anula el comportamiento anterior). Este es un problema muy interesante. gracias. – Andrie

Cuestiones relacionadas