我有一个如下所示的数据框:
#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等等。我想总结一些关于药物DRUG
和FED状态FED
的AUC,Tmax和Cmax的统计数据。我用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中未分面的统计数据。
知道为什么吗?我怎样才能让它做正确的事呢?
答案 0 :(得分:91)
我相信您在 dplyr 之后加载了 plyr ,这就是为什么您要获得整体摘要而不是分组摘要。
最后加载 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
答案 1 :(得分:16)
aosmith答案的一个变种可能会帮助一些人。直接R直接调用dplyr的函数。当一个包装干扰另一个包装时的好技巧。
dist/
答案 2 :(得分: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
答案 3 :(得分:1)
除了 dplyr,用户还经常使用 ggplot 和 ggpubr 函数。它实际上是另一个常用的包,它与 dplyr 有一些不兼容。同样,如上所示,您可以使用dplyr::package,但如果它一直无法正常工作,就像我遇到的那样,只需分离库就足够了,
detach("package:ggpubr", unload = TRUE)
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))
答案 4 :(得分:-1)
尝试sqldf是最好的方法,并且易于学习,可以对数据进行分组。 下面是您需要的示例。各种数据样本分组sqldf库非常有帮助。
install.packages("sqldf")
library(sqldf)
dat1 <- sqldf("select x,y,
y/sum(y) as Z
from dat
group by x")