【问题标题】:ggplot differences between groupsggplot组间差异
【发布时间】:2019-07-15 15:05:17
【问题描述】:

我有一个包含不同试验组的 df,我想在 ggplot 中制作一个仅包含试验之间增量的条形图。很难让 ggplot 理解我想要一个 df 的差异。此外,第二次试验中没有表示某些治疗方法,所以我只想将其计为 0(即 delta 将 = 试验 1 - 0)。

 set.seed(1)

 df <- data.frame((matrix(nrow=175,ncol=4)))
 colnames(df) <- c("group","trial","count","hour")
 df$group <- rep(c("A","B","C","D","A","B","D"),each=25)
 df$trial <- rep(c(rep(1,times=100),rep(2,times=75)))
 df$count <- runif(175,0,50)
 df$hour <- rep(1:25,times=7)


 df2 <- aggregate(df[,3:4],list(df$group,df$trial),mean)
 colnames(df2)[1:2] <- c("group","trial") 

这就是我到达的地方。我已经为 (group*trial) 绘制了单个条形图,但我不知道如何减去它们。我想要 x=group 和 y= delta(trial) 的图。

我试过这个:

 ggplot(df2 %>% group_by(group) %>% delta=diff(count),
   aes(x=group,y=delta)) + geom_bar()

从我遇到的类似帖子中,但没有运气。

【问题讨论】:

  • 你必须通过管道进入函数。 df2 %&gt;% group_by(group) %&gt;% delta=diff(count) group_by 是一个函数,但 delta = 不是一个可管道化的函数。大概你想要df2 %&gt;% group_by(group) %&gt;% summarize(delta=diff(count))。或者您可以像上面那样使用aggregate,而不是dplyr 管道。
  • 您还有一个问题,即单个数字的 diff() 不返回任何内容,而不是 NA,因此更改为 summarize(delta = if(n() != 2) diff(count) else NA) 将确保您获得每个组的长度为 1 的结果。
  • @Gregor 感谢您澄清管道。所以,当我使用group_by(group) %&gt;% summarize(delta=diff(count)) 时,我得到一个向量的返回,这似乎 df2 只是取了每一行和下一行之间的差异,而不是按组。然后当我添加你的第二个编辑时,我得到一个涉及 n() 的错误。我对 aggregate[] 的理解更好一些,但是当我使用 aggregate(df2[,3:4],list(df$group),diff()) 时,由于缺少 C2 组而出现错误。有什么想法可以添加一个 if 来聚合 [] 来否定这个吗?
  • 听起来你在dplyr 之后加载了plyr,忽略了打印的警告as in this R-FAQ。建议的修复程序在那里。
  • 我明白了:您想绘制每次试验组均值的增量?

标签: r ggplot2 group-by difference


【解决方案1】:

这应该可以解决问题:

ggplot(df2 %>% group_by(group) %>% summarise(delta=ifelse(nrow(.)>1,diff(count),0)),
       aes(x=group,y=delta)) + geom_col()#geom_bar(stat="identity")

问题是,当只有一个输入值时,“diff”返回的不是值0,而是一个长度为 0 的向量。另外,我推荐geom_col,而不是使用geom_bar。您应该考虑的另一件事是差异结果取决于数据框的顺序。因此,我建议使用

ggplot(df2 %>% group_by(group) %>% summarise(delta_trial_1_trial_2=
                                           ifelse(length(trial)>1,
                                                  count[trial==2]-count[trial==1],0)),
   aes(x=group,y=delta_trial_1_trial_2)) + geom_col()

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2020-05-06
    • 2011-09-12
    • 1970-01-01
    • 2022-09-29
    • 2018-07-07
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多