使用purrr :: pmap对

时间:2018-01-29 14:23:25

标签: r ggplot2 dplyr purrr

我想使用purrr::pmap生成的结果来绘制直方图,其中包含一些四分位数的参考线。

我有以下数据

   mean    sd     n
  <dbl> <dbl> <dbl>
  5.00  3.00   100
  4.00  1.00   100
  4.00  2.00   100

这里的数据是一种易于复制和粘贴的格式

df <- tribble(
  ~mean,  ~sd,   ~n,
  5.00,  3.00,   100,
  4.00,  1.00,   100,
  4.00,  2.00,   100)

到目前为止我的代码是

df %>% pmap(rnorm) 

问题是我现在有嵌套列表而不是整洁的数据帧。我怎样才能整理3个直方图,用参考线绘制中位数,第1和第3个四分位数?

1 个答案:

答案 0 :(得分:2)

您可以使用unnest()整理数据,但为此需要将pmap - 调用分配给您的df中的列(例如,在mutate - 调用内)。< / p>

library(tidyverse)

df <- df %>% 
  mutate(rnorm_data = pmap(list(n, mean, sd), rnorm)) %>% 
  group_by(mean_sd = interaction(mean, sd, sep = "_")) %>% 
  unnest() 

df
# A tibble: 300 x 5
# Groups:   mean_sd [3]
#     mean    sd     n mean_sd rnorm_data
#    <dbl> <dbl> <dbl>  <fctr>      <dbl>
#  1     5     3   100     5_3   4.737157
#  2     5     3   100     5_3   5.221150
#  3     5     3   100     5_3   3.855733
#  4     5     3   100     5_3   8.965053
#  5     5     3   100     5_3   2.608563
#  6     5     3   100     5_3  11.940414
#  7     5     3   100     5_3   8.213685
#  8     5     3   100     5_3   6.332804
#  9     5     3   100     5_3   6.233713
# 10     5     3   100     5_3   4.758685
# # ... with 290 more rows

我添加了group_by以便稍后参考ggplot - 调用以及总结以下数据:

df_summarized <- df %>% 
  summarize(median = median(rnorm_data), 
            quart1st = quantile(rnorm_data, 0.25), 
            quart3rd = quantile(rnorm_data, 0.75)) %>% 
  gather(stat, value, median:quart3rd) 

使用gather我可以为不同的摘要统计信息设置不同的linetypes

ggplot(df, aes(rnorm_data, fill = mean_sd, color = mean_sd)) + 
  geom_histogram() + 
  geom_vline(data = df_summarized, 
             aes(xintercept = value, linetype = stat, color = mean_sd))

enter image description here