2014-09-29 15 views
13

Hinweis: Der Titel dieser Frage wurde bearbeitet, um die kanonische Frage für Probleme zu stellen, wenn plyr Funktionen ihre dplyr Gegenstücke maskieren. Der Rest der Frage bleibt unverändert.Warum funktioniert Zusammenfassung oder Mutation nicht, wenn ich "plyr" nach "dplyr" lade?


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 ich eine kleine Tabelle erstellen kann meine Daten mit dem folgenden Code zusammenfassen:

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

Der Ausgang Blick so:

group sex mean sd 
1  A F 49.68 5.68 
2  A M 32.21 6.27 
3  B F 31.87 9.80 
4  B M 37.54 9.73 
5  C F 40.61 15.21 
6  C M 36.33 11.33 

Ich versuche, meinen Code auf dplyr und den %>% Operator zu verschieben. Mein Code nimmt DF dann gruppieren Sie es nach Gruppe und Geschlecht und dann zusammenfassen. Das heißt:

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

Aber meine Ausgabe lautet:

mean sd 
1 35.56 9.92 

Was mache ich falsch?

Danke!

Antwort

19

Das Problem hier ist, dass Sie dplyr zuerst und dann plyr laden, so maskiert plyr Funktion summarise dplyrs Funktion summarise. Wenn das passiert erhalten Sie 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 

So, um Ihren Code zu arbeiten, entweder trennen plyr detach(package:plyr) oder neu starten, R und Last plyr zuerst und dann dplyr (oder lädt 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  A F 41.51 8.24 
2  A M 32.23 11.85 
3  B F 38.79 11.93 
4  B M 31.00 7.92 
5  C F 24.97 7.46 
6  C M 36.17 9.11 

Oder Sie können anrufen dplyr die explizit im Code zusammenfassen, so wird die richtige Funktion egal genannt werden, wie Sie die Pakete laden:

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

+1 für einige Sekunden :-) – A5C1D2H2I1M1N2O1R2T1

+8

Ich verstehe nicht, warum so wenige Menschen bemerken, dass Warnung:/ – hadley

+1

@hadley 'Vermögen :: Vermögen (9)' – Gregor

4

Ihr CodeAufrufstatt 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  A F 32.17 6.30 
# 2  A M 30.98 7.37 
# 3  B F 38.20 7.67 
# 4  B M 33.12 12.24 
# 5  C F 43.91 10.31 
# 6  C M 47.53 8.25