如何用for循环或purrr包简化R中多问卷题的重复统计导出工作
批量生成多选题频率表并导出Excel
假设你的数据集名为survey_data,多选题列名为q1至q10,分组变量为age和region,且多选题选项以逗号分隔(如"选项A,选项B")。以下提供for循环和purrr批量处理两种方案,复用单题处理逻辑:
前置准备:加载依赖包与定义通用处理函数
首先加载所需工具包,并封装单题的三类频率表生成逻辑为函数,避免重复代码:
library(tidyverse) library(openxlsx) # 定义生成单题三类频率表的函数 generate_freq_tables <- function(question_col, data) { # 1. 总体频率表 overall_freq <- data %>% separate_rows({{ question_col }}, sep = ",") %>% mutate({{ question_col }} := trimws({{ question_col }})) %>% count({{ question_col }}, name = "count") %>% mutate(percentage = round(count / sum(count) * 100, 2), group = "总体") %>% select(group, {{ question_col }}, count, percentage) # 2. 按age分组频率表 age_grouped_freq <- data %>% separate_rows({{ question_col }}, sep = ",") %>% mutate({{ question_col }} := trimws({{ question_col }})) %>% count(age, {{ question_col }}, name = "count") %>% group_by(age) %>% mutate(percentage = round(count / sum(count) * 100, 2), group = paste0("按age分组_", age)) %>% ungroup() %>% select(group, {{ question_col }}, count, percentage) # 3. 按region分组频率表 region_grouped_freq <- data %>% separate_rows({{ question_col }}, sep = ",") %>% mutate({{ question_col }} := trimws({{ question_col }})) %>% count(region, {{ question_col }}, name = "count") %>% group_by(region) %>% mutate(percentage = round(count / sum(count) * 100, 2), group = paste0("按region分组_", region)) %>% ungroup() %>% select(group, {{ question_col }}, count, percentage) # 合并三类表并返回 bind_rows(overall_freq, age_grouped_freq, region_grouped_freq) }
方案1:使用for循环批量处理
创建Excel工作簿,遍历所有多选题列,生成频率表后写入对应工作表:
# 定义所有多选题列名 question_cols <- paste0("q", 1:10) # 创建空的Excel工作簿 wb <- createWorkbook() # 循环处理每道题 for (q_col in question_cols) { # 生成当前题的频率表 freq_table <- generate_freq_tables(!!sym(q_col), survey_data) # 添加工作表,命名为题目列名 addWorksheet(wb, sheetName = q_col) # 将频率表写入工作表 writeData(wb, sheet = q_col, x = freq_table) } # 保存Excel文件 saveWorkbook(wb, file = "多选题频率表汇总.xlsx", overwrite = TRUE)
方案2:使用purrr包批量处理
利用purrr::walk遍历题目列,无需返回结果,直接完成写入操作:
# 创建空工作簿 wb <- createWorkbook() # 用walk遍历每道题,写入Excel walk(question_cols, function(q_col) { freq_table <- generate_freq_tables(!!sym(q_col), survey_data) addWorksheet(wb, sheetName = q_col) writeData(wb, sheet = q_col, x = freq_table) }) # 保存文件 saveWorkbook(wb, file = "多选题频率表汇总_purrr版.xlsx", overwrite = TRUE)
说明
- 若你的多选题存储格式不是逗号分隔(如多列二进制编码),只需修改
generate_freq_tables函数中的拆分逻辑即可。 - 可根据需求调整频率表的格式(如百分比小数位数、列顺序),或在写入Excel时添加样式(使用
openxlsx的addStyle函数)。
内容的提问来源于stack exchange,提问作者ffew
相关产品推荐
相关产品推荐

