使用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 dfmutate
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()))