You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:24:55