【问题标题】:How to rearrange multiple columns (with dplyr) for faceted bar graphs (generated with ggplot) in R?如何在 R 中为多面条形图(使用 ggplot 生成)重新排列多列(使用 dplyr)?
【发布时间】:2019-03-17 13:23:39
【问题描述】:

我有一个类似于下面的数据框。

(在我的原始数据框中,除了 gs 和 us 之外,我还有 ps 和 qs + 它们的置信区间)。

df <- read.table(text="
       university      gs  gs.ci.l  gs.ci.u       us  us.ci.l  us.ci.u
1           A        0.90     0.89     0.92     0.08    0.079    0.081
2           B        0.80     0.78     0.82     0.18    0.179    0.181
3           C        0.70     0.69     0.71     0.27    0.269    0.271
4           D        0.60     0.64     0.63     0.30    0.291    0.34", header=T)

[Q1] 我想用 dplyr 重新排列我的数据框以创建分面条形图(每个大学一个方面,每个方面显示 2 个条形(gs + 置信区间 [gs.ci.l; gs.ci.u] 和 us + 置信区间 [ us.ci.l; us.ci.u])

为了生成上述输出,重新排列数据框的最佳方法是什么? 我尝试使用 collect ( ) 将均值和置信限分别强制到相同的列中。

[Q2] 相关地,是否有一种优雅的方法可以立即在列中排列 dplyr::summarise( ) %>% select( ) 的输出?在我的示例中,我希望将“gs”和“us”排列在“ci_low”和“gs. ci.u”和“gs.ci.u”提前放在一个名为“ci_up”的列中。

【问题讨论】:

  • 更好地直观地显示预期的输出。使其更快地跟随(在我看来)。
  • 看起来有点像这样:strengejacke.files.wordpress.com/2013/03/groupbars-5.png。每种颜色代表一所大学,但每种颜色(gs,us)只有两个条形图,每个条形图显示 CI。我希望这会有所帮助。
  • 我建议使用tidyr::gather 转换为长格式,然后使用mutate 创建一个变量,告诉每列是否与gs 或我们相关,另一个告诉该列是否是基值或 ci.l 或 ci.u 值。然后你可以将它们直接输入 ggplot。
  • @Jon Spring。那么在实践中你会怎么做呢?

标签: r ggplot2 dplyr


【解决方案1】:

在升级到第一季度 - 我不确定我是否正确地设想了您的预期输出。是在球场下面吗?注意:我在这里只做最少的格式化。此外,该示例有一些混乱和轻微的 CI,这使得部分输出没有意义或难以阅读。在某些情况下,格式化会有所帮助。

library(tidyverse)

test <- df %>% 
  select(university, mu = gs, ci.l = gs.ci.l,ci.u = gs.ci.u) %>% 
  mutate(label = 'gs') %>% 
  bind_rows(., df %>% 
          select(university, mu = us, ci.l = us.ci.l,ci.u = us.ci.u) %>% 
          mutate(label = 'us'))

test %>% ggplot(., aes(y = mu, x = label)) + 
  geom_bar(stat="identity") +
  geom_errorbar(aes(ymin = ci.l, ymax=ci.u, width =.3)) +
  facet_wrap(~university) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

【讨论】:

  • 太棒了!谢谢!是的,这正是我想要的!
【解决方案2】:

与@Peter_Evan 类似的解决方案,使用tidyr::gathertidyr::spread 准备数据:

library(tidyverse)
df %>% 
  gather(col, val, gs:us.ci.u) %>% 
  mutate(categ = str_sub(col, end = 2), stat = str_sub(col, start = 4)) %>%
  mutate(stat = if_else(stat == "", "mean", stat)) %>%
  select(-col) %>% 
  spread(stat, val) %>%

  ggplot(aes(categ)) +
  geom_col(aes(y = mean)) +
  geom_errorbar(aes(ymin = ci.l, ymax = ci.u)) +
  facet_wrap(~university, nrow = 1)

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多