2012-06-07 13 views
17

Volevo creare un plotter in cui le barre fossero ordinate per altezza anziché in ordine alfabetico per categoria. Questo ha funzionato bene quando l'unico pacchetto che ho caricato era ggplot2. Tuttavia, quando ho caricato alcuni altri pacchetti e ho eseguito lo stesso codice che ha creato, ordinato e tracciato il mio frame di dati, le barre sono state ripristinate in ordine alfabetico di nuovo.Il fattore di riordino dà risultati diversi, a seconda dei pacchetti caricati

Ho controllato il data frame ogni volta utilizzando str() e si è scoperto che gli attributi del frame di dati erano ora diversi, anche se avrei eseguito lo stesso codice ogni volta.

Il mio codice e l'output sono elencati di seguito. Qualcuno può spiegare il diverso comportamento? Perché il caricamento di alcuni pacchetti apparentemente non correlati (non correlati nel senso che nessuna delle funzioni che sto utilizzando sembra essere mascherata dai pacchetti appena caricati) cambia il risultato dell'esecuzione della funzione transform()?

Caso 1: Appena ggplot2 caricato

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: Caricare diversi più colli, quindi eseguire lo stesso codice

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 

UPDATE: SessionInfo()

cassa 1: Ran sessionInfo() dopo aver caricato 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() dopo il caricamento dei pacchetti aggiuntivi

> 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

Potrebbe fornire l'output di 'sessionInfo()'?Se qualcuno può aiutare, potrebbe dover abbinare le versioni R e package per replicare questo. – joran

+0

Posso replicarlo su R 2.15.0 con i pacchetti CRAN aggiornati (su Ubuntu) – Justin

+1

Molto interessante. Sembra che il cambiamento nei risultati di 'transform()' compaia solo dopo aver caricato 'gmodels' (e non è stato risolto separando successivamente' gmodels'). Sono incuriosito ... (FWIW, sono su Windows XP, eseguendo R-devel, quindi sembra che questo non sia un problema specifico del sistema operativo o della versione.) –

risposta

13

Questo accade perché:

  1. gmodels importazioni gdata
  2. gdata crea un nuovo metodo per reorder.factor

Avvia una sessione pulita. Poi:

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

Ora caricare gdata (o caricare gmodels, che ha lo stesso effetto):

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

Avviso non c'è mascheratura, poiché reorder.factor non esiste nella base di

Ricrea il problema, ma questa volta chiamiamo esplicitamente i diversi pacchetti:

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

La versione base R (utilizzando 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 versione gdata (utilizzando 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

È possibile ottenere l'ordine "previsto" utilizzando la versione 'gdata :: reorder.factor' aggiungendo un argomento' FUN = identity': 'data1 = transform (dati, gruppo = riordino (gruppo, -num, FUN = identità)) '. –

+2

Giusto per essere sicuro di capire la lezione qui: quando carichi un pacchetto, puoi ottenere un comportamento diverso con lo stesso codice esatto, anche in assenza di mascheramento, se il nuovo pacchetto ha un metodo specifico per il tuo oggetto (in questo caso 'reorder.factor'), che" sovrascrive "il comportamento del metodo" top "-level (in questo caso,' riordino 'generico') che altrimenti si applicherebbe al tuo oggetto. È corretto? – eipi10

+1

@ eipi10 Sì, il tuo esempio lo dimostra chiaramente. Pedanteria sulla terminologia: 'reorder.factor' viene inviato piuttosto che' reorder.default' (quindi, in un certo senso, prevale sul comportamento precedente). Questo è un problema molto interessante. grazie. – Andrie

Problemi correlati