为什么我的dplyr group_由&;你工作不正常吗?(名称与plyr冲突)

为什么我的dplyr group_由&;你工作不正常吗?(名称与plyr冲突),r,plyr,dplyr,shadowing,name-collision,R,Plyr,Dplyr,Shadowing,Name Collision,我有一个如下所示的数据框: #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 等等。我想总结一些关于AUC、Tmax和Cmax的统计数据,这些数据按药物drug和FED状态FED。我使用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
等等。我想总结一些关于AUC、Tmax和Cmax的统计数据,这些数据按药物
drug
和FED状态
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))

<代码> CI90LO

或您可以考虑使用<代码>数据>表< /代码>

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

我相信您在dplyr之后加载了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
这就是上次加载的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

aosmith答案的一个变体,可能会帮助一些人。directr直接调用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))

Try-sqldf是分组数据的最佳方法,并且易于学习。 下面是您需要的示例。所有类型的数据样本分组sqldf库都非常有用

install.packages("sqldf")
library(sqldf)
dat1 <- sqldf("select x,y,
            y/sum(y) as Z
            from dat
            group by x")
install.packages(“sqldf”)
库(sqldf)

dat1除了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))

请查看此链接@akrun,非常感谢。实际上,我对dplyr软件包很满意,但它看起来不可靠!顺便说一句,您是否应该将您的函数标记为CI95hi和CI95lo,即使用95而不是90?@rnso我使用的是90%置信区间。这实际上是plyr+dplyr+偶尔使用其他库(ggplot2+xts)时的一个已知问题。还咬了我,调试也花了很多时间。非常感谢。那也行,不过,我用了ddply。ddply看起来比dplyr更可靠。值得一提的是,
ggplot2
也可能有这种效果-想必
plyr
是一种依赖关系。令人不安的是,名称空间在R XD中被视为一种伎俩