使用purrr映射的列对的迭代摘要

时间:2017-12-18 15:59:25

标签: r dplyr purrr rlang

我有一个大型数据集,我希望通过这个数据集获得一列的汇总估计值(平均值,中位数,计数等),并按其他两列进行分组。

尝试使用purrr努力解决如何执行此操作 - 希望将此工作流程单击以用于将来的项目...但非常困难。

作为一个可重现的示例,这适用于amvs的分组,以及估算mpg的汇总值

library(tidyverse)
library(rlang)

mtcars %>%
  group_by(am, vs) %>%
  summarise(mean_mpg = mean(mpg),
            median_mpg = median(mpg),
            count = n())

但是,要扩展此示例,请说我想要对amvs进行分组;然后amgear;然后是amcarb。直观地说,这似乎是map应该处理的事情。

group_vars <- c("vs", "gear", "carb")
group_syms <- rlang::syms(group_vars)
sym_am <- rlang::sym("am")

mtcars %>%
  map_df(~group_by(!!sym_am, !!!group_syms) %>%
           summarise(mean_mpg = mean(mpg),
           summarise(median_mpg = median(mpg),
           summarise(count = n())
  )

#Error in !sym_am : invalid argument type

2 个答案:

答案 0 :(得分:1)

这是一种方法

library(tidyverse)

variable_grp <- c("vs", "gear", "carb")
constant_grp <- c("am")
group_vars <- lapply(variable_grp, function(i) c(constant_grp, i))

map(group_vars, ~group_by_at(mtcars, .x) %>% 
                summarise(  mean_mgp = mean(mpg),
                        median_mpg = median(mpg),
                        count = n()))

这将生成每个组的摘要统计信息列表。使用map_df解决问题的问题在于,每个组的列名都不同(第一组:上午,下一组;第二组:上午,齿轮......)。因此,如果您使用variable_column

,则需要重命名map_df
map_df(group_vars, ~group_by_at(mtcars, .x) %>% 
                summarise(  mean_mgp = mean(mpg),
                        median_mpg = median(mpg),
                        count = n()) %>%
                setNames(c("am", "variable_column", "mean_mpg", "median_mpg", "count")))

# A tibble: 17 x 5
# Groups:   am [2]
      # am variable_column mean_mpg median_mpg count
   # <dbl>           <dbl>    <dbl>      <dbl> <int>
 # 1     0               0 15.05000      15.20    12
 # 2     0               1 20.74286      21.40     7
 # 3     1               0 19.75000      20.35     6
 # 4     1               1 28.37143      30.40     7
 # 5     0               3 16.10667      15.50    15
 # 6     0               4 21.05000      21.00     4
 # 7     1               4 26.27500      25.05     8
 # 8     1               5 21.38000      19.70     5
 # 9     0               1 20.33333      21.40     3
# 10     0               2 19.30000      18.95     6
# 11     0               3 16.30000      16.40     3
# 12     0               4 14.30000      14.30     7
# 13     1               1 29.10000      29.85     4
# 14     1               2 27.05000      28.20     4
# 15     1               4 19.26667      21.00     3
# 16     1               6 19.70000      19.70     1
# 17     1               8 15.00000      15.00     1

您可以使用variable_column的{​​{1}}参数和post-map_df .id

保存map_df名称
mutate

答案 1 :(得分:1)

我们可以使用map2中的purrr来使用多个符号作为参数,然后在group_bysummarise输出中对其进行评估

library(tidyverse)
map2_df(list(sym_am), group_syms, ~ mtcars %>%
         group_by(!!.x, !!.y) %>% 
         summarise(mean_mgp = mean(mpg), median_mpg = median(mpg),count = n()))