Perché riepilogare o mutare non funziona con group_by quando carico `plyr` dopo` dplyr`?

Nota: il titolo di questa domanda è stato modificato per renderlo la domanda canonica per problemi quando plyr funzioni plyr mascherano le loro controparti dplyr . Il resto della domanda rimane invariato.


Supponiamo di avere i seguenti dati:

 dfx <- data.frame( group = c(rep('A', 8), rep('B', 15), rep('C', 6)), sex = sample(c("M", "F"), size = 29, replace = TRUE), age = runif(n = 29, min = 18, max = 54) ) 

Con il buon vecchio plyr posso creare una piccola tabella riassumendo i miei dati con il seguente codice:

 require(plyr) ddply(dfx, .(group, sex), summarize, mean = round(mean(age), 2), sd = round(sd(age), 2)) 

L’output ha questo aspetto:

  group sex mean sd 1 AF 49.68 5.68 2 AM 32.21 6.27 3 BF 31.87 9.80 4 BM 37.54 9.73 5 CF 40.61 15.21 6 CM 36.33 11.33 

Sto provando a spostare il mio codice su dplyr e dplyr %>% . Il mio codice prende DF quindi lo raggruppa per gruppo e sesso e quindi lo riassume. Questo è:

 dfx %>% group_by(group, sex) %>% summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) 

Ma il mio risultato è:

  mean sd 1 35.56 9.92 

Che cosa sto facendo di sbagliato?

Il problema qui è che si sta caricando dplyr prima e poi plyr, quindi la funzione summarise plyr sta mascherando la funzione di dplyr summarise . Quando ciò accade, ricevi questo avviso:

 require(plyr) Loading required package: plyr ------------------------------------------------------------------------------------------ You have loaded plyr after dplyr - this is likely to cause problems. If you need functions from both plyr and dplyr, please load plyr first, then dplyr: library(plyr); library(dplyr) ------------------------------------------------------------------------------------------ Attaching package: 'plyr' The following objects are masked from 'package:dplyr': arrange, desc, failwith, id, mutate, summarise, summarize 

Quindi, per far funzionare il tuo codice, puoi staccare plyr detach(package:plyr) o riavviare R e caricare plyr prima e poi dplyr (o caricare solo dplyr):

 library(dplyr) dfx %>% group_by(group, sex) %>% summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) Source: local data frame [6 x 4] Groups: group group sex mean sd 1 AF 41.51 8.24 2 AM 32.23 11.85 3 BF 38.79 11.93 4 BM 31.00 7.92 5 CF 24.97 7.46 6 CM 36.17 9.11 

Oppure puoi richiamare esplicitamente il riepilogo di dplyr nel tuo codice, in modo che la funzione corretta venga chiamata indipendentemente dal modo in cui carichi i pacchetti:

 dfx %>% group_by(group, sex) %>% dplyr::summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) 

Il tuo codice chiama plyr::summarise invece di dplyr::summarise causa dell’ordine in cui hai caricato “plyr” e “dplyr”.

demo:

 library(dplyr) ## I'm guessing this is the order you loaded library(plyr) dfx %>% group_by(group, sex) %>% summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) # mean sd # 1 36.88 9.76 dfx %>% group_by(group, sex) %>% dplyr::summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) # Source: local data frame [6 x 4] # Groups: group # # group sex mean sd # 1 AF 32.17 6.30 # 2 AM 30.98 7.37 # 3 BF 38.20 7.67 # 4 BM 33.12 12.24 # 5 CF 43.91 10.31 # 6 CM 47.53 8.25