J'ai un cadre de données qui ressemble à ceci:
#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
Ans, etc. Je souhaite résumer certaines statistiques sur l’ASC, le Tmax et le Cmax par drogue DRUG
et par état de la nutrition FED
. J'utilise dplyr. Par exemple: pour la 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))
Cependant, la sortie n'est pas groupée par DRUG et FED. Il ne donne qu'une ligne contenant les statistiques de tous par non-facettes sur DRUG et FED.
Une idée pourquoi? et comment puis-je le faire faire la bonne chose?
Je crois que vous avez chargé plyr après dplyr, ce qui explique pourquoi vous obtenez un résumé global au lieu d'un résumé groupé.
C'est ce qui se passe avec plyr chargé en dernier.
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
Maintenant, supprimez plyr et essayez à nouveau et vous obtiendrez le résumé groupé.
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
Une variante de la réponse de aosmith qui pourrait aider certaines personnes. Demandez à R d’appeler directement les fonctions de dplyr. Bon truc quand un paquet interfère avec un autre.
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))
Ou vous pourriez envisager d'utiliser 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