如何在R中循环遍历变量批量调用分组统计函数?
批量分组统计员工数据的优化方案
问题背景
现有一份学校员工数据集,自定义了group_the_data函数用于按指定变量分组统计员工数量并添加分组标签,目前通过手动三次调用函数再合并结果,希望优化成批量处理方式,避免重复代码。
数据集定义
data <- data.frame(person_id = c(1, 2, 3, 4, 5, 6, 7, 8), disability_status = c("yes", "no", "yes", "no", "yes", "no", "yes", "no"), age_group = c("20-30","30-40","20-30","30-40","20-30","30-40","20-30","30-40"), teacher = c("yes", "no", "no", "yes", "no","yes", "no", "yes" ))
自定义分组函数
group_the_data <- function(data, variable, group_tag) { grouped_output <- data %>% mutate(flag = 1) %>% group_by({{variable}}) %>% summarise(number_staff = sum(flag, na.rm = T)) %>% mutate(grouping_tag := {{group_tag}}) return(grouped_output) }
原手动调用方式
disability_grouped <- group_the_data(data = data, variable = disability_status, group_tag = "disability status") age_group_grouped <- group_the_data(data = data, variable = age_group, group_tag = "age group") role_grouped <- group_the_data(data = data, variable = teacher, group_tag = "role") all_data_grouped <- bind_rows(disability_grouped, age_group_grouped, role_grouped)
优化方案
方法1:Base R 循环实现
先定义需要分组的变量名与对应标签的映射,通过for循环批量调用函数,最后合并结果:
# 定义变量名与标签的映射关系 group_vars <- list( disability_status = "disability status", age_group = "age group", teacher = "role" ) # 初始化空列表存储分组结果 result_list <- list() # 循环遍历每个变量 for (var_name in names(group_vars)) { result_list[[var_name]] <- group_the_data( data = data, variable = !!sym(var_name), # 将字符串转为可识别的变量 group_tag = group_vars[[var_name]] ) } # 合并所有分组结果 all_data_grouped <- bind_rows(result_list)
方法2:使用purrr包的map2函数(tidyverse风格)
purrr::map2适合处理成对的输入(变量名和对应标签),代码更简洁紧凑:
library(purrr) # 准备变量名和标签向量 vars <- c("disability_status", "age_group", "teacher") tags <- c("disability status", "age group", "role") # 批量调用函数并直接合并结果 all_data_grouped <- map2_dfr(vars, tags, function(var, tag) { group_the_data( data = data, variable = !!sym(var), group_tag = tag ) })
额外优化:简化自定义函数
原函数中通过mutate(flag=1)再sum(flag)统计数量的方式,可直接用summarise(number_staff = n())替代,更高效简洁:
group_the_data <- function(data, variable, group_tag) { data %>% group_by({{variable}}) %>% summarise(number_staff = n(), .groups = "drop") %>% # .groups="drop"清理分组状态 mutate(grouping_tag = {{group_tag}}) }
内容的提问来源于stack exchange,提问作者fe108
相关产品推荐
相关产品推荐

