Il fattore di riordino dà risultati diversi, a seconda dei pacchetti caricati

Volevo creare un barplot in cui le barre fossero ordinate per altezza anziché alfabeticamente 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.

Ho controllato ogni volta il frame di dati usando 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é caricare alcuni pacchetti apparentemente non correlati (non correlati nel senso che nessuna delle funzioni che sto usando sembra essere mascherata dai pacchetti appena caricati) cambia il risultato dell’esecuzione della funzione transform() ?

Caso 1: appena caricato ggplot2

 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: carica molti altri pacchetti, quindi esegui di nuovo lo stesso codice

 library(plyr) library(xtable) library(Hmisc) library(gmodels) library(reshape2) library(vcd) library(latex) 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 

AGGIORNAMENTO: SessionInfo ()

Caso 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 aver caricato i 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] latex_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 

Questo succede perché:

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

Inizia una sessione pulita. Poi:

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

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

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

Si noti che non vi è alcun mascheramento, dal momento che reorder.factor non esiste in base

Ricrea il problema, ma questa volta chiama 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 (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 versione 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