Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用purrr映射按列对进行迭代汇总_R_Dplyr_Purrr_Rlang - Fatal编程技术网

使用purrr映射按列对进行迭代汇总

使用purrr映射按列对进行迭代汇总,r,dplyr,purrr,rlang,R,Dplyr,Purrr,Rlang,我有一个大的数据集,我希望从中获得一列的汇总估计值(平均值、中位数、计数等),将其与其他两列进行分组 正在努力解决如何使用purr实现这一点-希望能让这个工作流在未来的项目中使用。。。但是我很困 作为一个可重复的示例,这适用于按am和vs进行分组,并估计mpg library(tidyverse) library(rlang) mtcars %>% group_by(am, vs) %>% summarise(mean_mpg = mean(mpg),

我有一个大的数据集,我希望从中获得一列的汇总估计值(平均值、中位数、计数等),将其与其他两列进行分组

正在努力解决如何使用
purr
实现这一点-希望能让这个工作流在未来的项目中使用。。。但是我很困

作为一个可重复的示例,这适用于按
am
vs
进行分组,并估计
mpg

library(tidyverse)
library(rlang)

mtcars %>%
  group_by(am, vs) %>%
  summarise(mean_mpg = mean(mpg),
            median_mpg = median(mpg),
            count = n())
然而,为了扩展这个例子,假设我想为
am
vs
分组;然后是
am
gear
;然后是
am
carb
。直觉上,这似乎是
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
组变量这里有一种方法

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\u df
.id
参数和post-map\u df
mutate

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")),
            .id="variable_col_name") %>%
            mutate(variable_col_name = variable_grp[as.numeric(variable_col_name)])

# A tibble: 17 x 6
# Groups:   am [2]
   # variable_col_name    am variable_column mean_mpg median_mpg count
               # <chr> <dbl>           <dbl>    <dbl>      <dbl> <int>
 # 1                vs     0               0 15.05000      15.20    12
 # 2                vs     0               1 20.74286      21.40     7
 # 3                vs     1               0 19.75000      20.35     6
 # 4                vs     1               1 28.37143      30.40     7
 # 5              gear     0               3 16.10667      15.50    15
 # 6              gear     0               4 21.05000      21.00     4
 # 7              gear     1               4 26.27500      25.05     8
 # 8              gear     1               5 21.38000      19.70     5
 # 9              carb     0               1 20.33333      21.40     3
# 10              carb     0               2 19.30000      18.95     6
# 11              carb     0               3 16.30000      16.40     3
# 12              carb     0               4 14.30000      14.30     7
# 13              carb     1               1 29.10000      29.85     4
# 14              carb     1               2 27.05000      28.20     4
# 15              carb     1               4 19.26667      21.00     3
# 16              carb     1               6 19.70000      19.70     1
# 17              carb     1               8 15.00000      15.00     1
map\u df(组变量,~group\u by\u at(mtcars.x)%>%
总结(平均值=平均值(mpg),
中位数=中位数(mpg),
计数=n())%>%
集合名(c(“am”、“变量列”、“平均值”、“中值”、“计数”),
.id=“变量列名称”)%>%
mutate(variable\u col\u name=variable\u grp[as.numeric(variable\u col\u name)])
#A tibble:17 x 6
#组别:am[2]
#变量列名称变量列平均值中位数计数
#                        
#1对0 15.05000 15.20 12
#2对0 120.74286 21.40 7
#3对1019.7500020.356
#4对1 28.37143 30.40 7
#5档0 3 16.10667 15.50 15
#6档0 4 21.05000 21.00 4
#7档1 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 29.10000 29.85 4
#14 carb 1 2 27.05000 28.20 4
#15卡1 19.26667 21.00 3
#16碳水化合物1 6 19.70000 19.70 1
#17卡1 815.0000015.00 1

我们可以使用
purr
中的
map2
使用多个符号作为参数,然后在
组中通过
总结
输出对其进行评估

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()))

谢谢-非常优雅!请问为什么需要
列表(sym_am)
?当我省略时,我得到了“Error:
.x
不是一个向量(符号)”,但我认为我已经作为一个符号调用了?@PeterMacPherson使用
c(sym\u am)
list(sym\u am)
将它放在
列表中,然后它就被回收,特别是对于
map
base R
映射在没有它的情况下应该可以工作
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()))