为什么我的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中被视为一种伎俩