Dlaczego moja grupa dplyr by & summarize nie działa poprawnie? (nazwa-kolizja z plyr)
Mam ramkę danych, która wygląda tak:
#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 tak dalej. Chcę podsumować niektóre statystyki dotyczące AUC, Tmax i Cmax według leku DRUG
i statusu FED FED
. Używam dplyr. Na przykład: dla 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))
Jednak produkcja nie jest pogrupowana według narkotyków i pożywienia. Daje tylko jeden wiersz zawierający statystyki wszystkich przez nie fasetowane na narkotyki i karmione.
Wiesz dlaczego? i jak Mogę sprawić, że zrobi to, co należy?3 answers
Wierzę, że załadowałeś plyr po dplyr , dlatego otrzymujesz podsumowanie ogólne zamiast podsumowania grupowego.
Tak się dzieje zplyr załadowanym jako ostatni.
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
Teraz usuń plyr i spróbuj jeszcze raz, a otrzymasz pogrupowane podsumowanie.
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-14 15:15:39
Wariant odpowiedzi aosmith, który może pomóc niektórym ludziom. Bezpośrednie R wywołanie funkcji dplyr bezpośrednio. Dobra sztuczka, gdy jedna paczka zakłóca drugą.
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))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 18:35:12
Lub możesz rozważyć użycie 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-14 06:49:31