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

093gszye  于 2023-01-18  发布在  其他
关注(0)|答案(6)|浏览(136)

我有一个数据框,看起来像这样:

#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

等等,我想总结一下药物DRUG和FED STATUS 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))

但是,输出没有按药物和FED分组,它只给出一行,其中包含所有未按药物和FED分面的统计信息。
知道为什么吗,我怎么才能让它做正确的事?

6xfqseft

6xfqseft1#

我相信您在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
tp5buhyn

tp5buhyn2#

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))
bpzcxfmw

bpzcxfmw3#

除了dplyr之外,用户经常使用ggplotggpubr函数。事实上,这是另一个与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))
hwazgwia

hwazgwia4#

或者您可以考虑使用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
8fq7wneg

8fq7wneg5#

尝试sqldf是最好的方法和简单易学的数据分组。下面是例子,以您的需要。各种数据样本分组sqldf库是非常有帮助的。

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

egdjgwm86#

我卸载了打包的plyr和dplyr,在dplyr之前安装了plyr。我的group_by仍然会导致重复的值,因为它是以最简单的方式使用的:

df %>%
group_by(day)

##    Count Month   Day  Hour member_casual
##    <int> <int> <int> <int> <chr>        
##  1   111     4    17    19 member       
##  2    12     4    25     2 member       
##  3     2     4     1     6 casual       
##  4   372     4    19    13 member       
##  5    16     4    16    20 casual       
##  6   176     4    20    19 member       
##  7     2     4    24     3 casual       
##  8    70     4    30     8 member       
##  9    15     4     2     5 member       
## 10    94     4    16     7 member

其中发现16多次出现在那里
因此,我有义务使用T-SQL而不是R进行分组。

相关问题