Warum funktioniert Zusammenfassung oder Mutation nicht mit group_by, wenn ich `plyr` nach` dplyr` lade?

Hinweis: Der Titel dieser Frage wurde bearbeitet, um die kanonische Frage für Probleme zu stellen, wenn plyr functionen ihre dplyr Gegenstücke dplyr . Der Rest der Frage bleibt unverändert.


Angenommen, ich habe folgende Daten:

 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) ) 

Mit dem guten alten plyr kann ich eine kleine Tabelle erstellen, die meine Daten mit folgendem Code zusammenfasst:

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

Die Ausgabe sieht so aus:

  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 

Ich versuche, meinen Code in dplyr und den Operator %>% . Mein Code nimmt DF dann gruppieren Sie es nach Gruppe und Geschlecht und dann zusammenfassen. Das ist:

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

Aber meine Ausgabe ist:

  mean sd 1 35.56 9.92 

Was mache ich falsch?

Das Problem hier ist, dass Sie zuerst dplyr laden und dann plyr, so plyrs function summarise maskiert ist dplyr die function summarise . Wenn das passiert, bekommst du diese Warnung:

 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 

Damit dein Code funktioniert, entferne entweder plier detach detach(package:plyr) oder detach(package:plyr) R neu und lade zuerst plyr und dann dplyr (oder lade nur 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 

Oder Sie können dplyrs Zusammenfassung in Ihrem Code explizit aufrufen, damit die richtige function aufgerufen wird, unabhängig davon, wie Sie die Pakete laden:

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

Ihr Code ruft plyr::summarise anstelle von dplyr::summarise aufgrund der Reihenfolge, in der Sie “plyr” und “dplyr” geladen haben.

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