2014-11-14 16 views
23

Ich habe einen Datenrahmen, der wie folgt aussieht:Warum funktioniert mein dplyr group_by & summary nicht richtig? (Name-Kollision mit plyr)

#df 
ID DRUG FED AUC0t Tmax Cmax 
1 1  0 100  5  20 
2 1  1 200  6  25 
3 0  1 NA  2  30 
4 0  0 150  6  65 

Am so weiter. Ich möchte einige Statistiken über AUC, Tmax und Cmax nach Medikament DRUG und FED STATUS FED zusammenfassen. Ich benutze dplyr. Beispiel: für die AUC:

CI90lo <- function(x) quantile(x, probs=0.05, na.rm=TRUE) 
CI90hi <- function(x) quantile(x, probs=0.95, na.rm=TRUE) 

summary <- df %>% 
      group_by(DRUG,FED) %>% 
      summarize(mean=mean(AUC0t, na.rm=TRUE), 
           low = CI90lo(AUC0t), 
           high= CI90hi(AUC0t), 
           min=min(AUC0t, na.rm=TRUE), 
           max=max(AUC0t,na.rm=TRUE), 
           sd= sd(AUC0t, na.rm=TRUE)) 

Der Ausgang ist jedoch nicht nach DRUG und FED gruppiert. Es gibt nur eine Zeile mit den Statistiken von allen, die auf DRUG und FED nicht facettiert sind.

Irgendeine Idee warum? und wie kann ich es dazu bringen, das Richtige zu tun?

+0

Bitte überprüfen Sie diesen Link http://stackoverflow.com/questions/21653295/dplyr-issues-with-group-by – akrun

+0

@akrun Vielen Dank. Ich war eigentlich glücklich mit dem dplyr-Paket, aber es sieht so aus, als wäre es nicht zuverlässig! – Amer

+0

BTW, sollten Sie nicht Ihre Funktionen als CI95hi und CI95lo bezeichnen, also mit 95 statt mit 90? – rnso

Antwort

59

mit glaube ich Sie plyr nach dplyr geladen haben, weshalb Sie eine Zusammenfassung statt einer gruppierten Zusammenfassung bekommen.

Dies geschieht mit plyr zuletzt geladen.

library(dplyr) 
library(plyr) 
df %>% 
     group_by(DRUG,FED) %>% 
     summarize(mean=mean(AUC0t, na.rm=TRUE), 
       low = CI90lo(AUC0t), 
       high= CI90hi(AUC0t), 
       min=min(AUC0t, na.rm=TRUE), 
       max=max(AUC0t,na.rm=TRUE), 
       sd= sd(AUC0t, na.rm=TRUE)) 

    mean low high min max sd 
1 150 105 195 100 200 50 

Jetzt plyr und versuchen Sie es erneut entfernen und Sie die gruppierte Zusammenfassung erhalten.

detach(package:plyr) 
df %>% 
     group_by(DRUG,FED) %>% 
     summarize(mean=mean(AUC0t, na.rm=TRUE), 
       low = CI90lo(AUC0t), 
       high= CI90hi(AUC0t), 
       min=min(AUC0t, na.rm=TRUE), 
       max=max(AUC0t,na.rm=TRUE), 
       sd= sd(AUC0t, na.rm=TRUE)) 

Source: local data frame [4 x 8] 
Groups: DRUG 

    DRUG FED mean low high min max sd 
1 0 0 150 150 150 150 150 NaN 
2 0 1 NaN NA NA NA NA NaN 
3 1 0 100 100 100 100 100 NaN 
4 1 1 200 200 200 200 200 NaN 
+0

Erwähnenswert, dass 'ggplot2' auch diesen Effekt haben kann - vermutlich ist' plyr' eine Abhängigkeit. – geotheory

2

Oder Sie könnten prüfen data.table

library(data.table) 
setDT(df) # set the data frame as data table 
df[, list(mean = mean(AUC0t, na.rm=TRUE), 
      low = CI90lo(AUC0t), 
      high = CI90hi(AUC0t), 
      min = as.double(min(AUC0t, na.rm=TRUE)), 
      max = as.double(max(AUC0t, na.rm=TRUE)), 
      sd = sd(AUC0t, na.rm=TRUE)), 
    by=list(DRUG, FED)] 

# DRUG FED mean low high min max sd 
# 1: 1 0 100 100 100 100 100 NA 
# 2: 1 1 200 200 200 200 200 NA 
# 3: 0 1 NaN NA NA Inf -Inf NA 
# 4: 0 0 150 150 150 150 150 NA 
# Warning messages: 
# 1: In min(AUC0t, na.rm = TRUE) : 
# no non-missing arguments to min; returning Inf 
# 2: In max(AUC0t, na.rm = TRUE) : 
# no non-missing arguments to max; returning -Inf 
+0

vielen dank. Das würde auch funktionieren, aber ich benutzte stattdessen die ddply. ddply sieht zuverlässiger aus als der dplyr. – Amer

4

Eine Variante von Aosmiths Antwort, die einigen Leuten helfen könnte. Direct R, um dplyrs Funktionen direkt aufzurufen. Guter Trick, wenn ein Paket mit einem anderen kollidiert.

df %>% 
     dplyr::group_by(DRUG,FED) %>% 
     dplyr::summarize(mean=mean(AUC0t, na.rm=TRUE), 
       low = CI90lo(AUC0t), 
       high= CI90hi(AUC0t), 
       min=min(AUC0t, na.rm=TRUE), 
       max=max(AUC0t,na.rm=TRUE), 
       sd= sd(AUC0t, na.rm=TRUE))