为什么我的dplyr group_by&summary不能正常工作?(与plyr的名字冲突)

Ame*_*mer 38 r shadowing plyr name-collision dplyr

我有一个如下所示的数据框:

#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
Run Code Online (Sandbox Code Playgroud)

答案等等.我想总结药物DRUG和FED状态的AUC,Tmax和Cmax的一些统计数据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))
Run Code Online (Sandbox Code Playgroud)

但是,输出不按DRUG和FED分组.它只给出一行包含DRUG和FED中未分面的统计数据.

知道为什么吗?我怎样才能让它做正确的事情?

aos*_*ith 108

我相信你已经加载plyrdplyr,这就是为什么你得到一个全面总结,而不是分组汇总.

最后加载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
Run Code Online (Sandbox Code Playgroud)

现在删除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
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,ggplot2也可以起到这种作用-大概plyr是一个依赖项。 (2认同)

mma*_*123 19

aosmith答案的一个变种可能会帮助一些人.直接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))
Run Code Online (Sandbox Code Playgroud)


小智 6

除了 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))
Run Code Online (Sandbox Code Playgroud)