Почему мой dplyr group_by & summary не работает должным образом? (имя-столкновение с 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
Ans и так далее. Я хочу обобщить некоторые статистические данные по AUC, Tmax и Cmax препаратом DRUG
и FED STATUS FED
. Я использую dplyr. Например: для 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))
Однако вывод не сгруппирован с помощью DRUG и FED. Он дает только одну строку, содержащую статистику всех, не разбитую на DRUG и FED.
Любая идея, почему? и как я могу заставить его поступать правильно?
Ответы
Ответ 1
Я уверен, что вы загрузили plyr после dplyr, поэтому вы получаете общее резюме вместо сгруппированного резюме.
Это то, что происходит с последним загруженным plyr.
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
Теперь удалите plyr и повторите попытку, и вы получите сгруппированное резюме.
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
Ответ 2
Вариант ответа Aosmith, который может помочь некоторым людям. Direct R для прямого вызова функций dplyr. Хороший трюк, когда один пакет мешает другому.
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))
Ответ 3
Или вы можете использовать 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
Ответ 4
Попробуйте sqldf - это лучший способ и легко научиться группировать данные.
Ниже приведен пример для вашей потребности. Все виды группирования примеров библиотеки sqldf очень полезны.
install.packages("sqldf")
library(sqldf)
dat1 <- sqldf("select x,y,
y/sum(y) as Z
from dat
group by x")