如何批量统计tibble中STYL类变量的分组计数并写入Excel?
问题根源
你的原代码无法运行,是因为group_by(tempo_variable)里的tempo_variable是字符串,dplyr会把它当成一个新的变量名,而不是引用tested_data里对应的列。我们需要把字符串转换成dplyr能识别的变量引用。
下面提供两种解决方案:修正后的for循环版本,以及更符合tidyverse风格的无循环方案,同时包含写入Excel的完整流程。
方案1:修正for循环版本
这个方案保留你熟悉的循环逻辑,同时解决变量解析问题,还能自动识别所有以STYL开头的变量(不用手动维护列表):
library(tibble) library(dplyr) library(openxlsx) # 示例数据 tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3)) # 自动获取所有以STYL开头的变量名(无需手动写列表) styl_vars <- grep("^STYL", colnames(tested_data), value = TRUE) # 创建Excel工作簿和工作表 wb <- createWorkbook() addWorksheet(wb, sheetName = "STYL频数统计") # 控制写入的起始行 start_row <- 1 for (tempo_var in styl_vars) { # 正确引用字符串变量:用.data[[tempo_var]]或!!sym(tempo_var) dt <- tested_data %>% group_by(.data[[tempo_var]]) %>% # .data是tidyverse推荐的字符串变量引用方式 count(name = "频数") %>% # 给计数列起个直观的名字 ungroup() %>% rename(!!tempo_var := `.data[[tempo_var]]`) # 把列名改回原变量名 # 写入Excel:先写变量名作为标题,再写统计结果 writeData(wb, sheet = "STYL频数统计", x = tempo_var, startRow = start_row, startCol = 1) start_row <- start_row + 1 writeData(wb, sheet = "STYL频数统计", x = dt, startRow = start_row, startCol = 1) # 写完后空一行,提升可读性 start_row <- start_row + nrow(dt) + 1 } # 保存工作簿 saveWorkbook(wb, "STYL变量频数统计.xlsx", overwrite = TRUE)
方案2:无循环的tidyverse风格方案
如果不想用循环,可以用tidyr转长格式后一次性统计,或者用purrr批量处理,下面是两种更简洁的实现:
方式A:转长格式后统一统计
这种方式最简洁,适合需要把所有结果合并成一张表的场景:
library(tibble) library(dplyr) library(tidyr) library(openxlsx) tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3)) # 把宽格式转成长格式,然后分组统计所有变量的频数 all_freq <- tested_data %>% pivot_longer( cols = starts_with("STYL"), names_to = "变量名", values_to = "取值" ) %>% group_by(变量名, 取值) %>% count(name = "频数") %>% ungroup() # 写入Excel wb <- createWorkbook() addWorksheet(wb, sheetName = "合并频数统计") writeData(wb, sheet = "合并频数统计", x = all_freq) saveWorkbook(wb, "STYL合并频数统计.xlsx", overwrite = TRUE)
方式B:用purrr批量处理(保留分块写入格式)
如果需要和循环一样分块写入Excel(每个变量结果单独成块),可以用purrr::walk执行写入操作:
library(tibble) library(dplyr) library(purrr) library(openxlsx) tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3)) styl_vars <- grep("^STYL", colnames(tested_data), value = TRUE) wb <- createWorkbook() addWorksheet(wb, sheetName = "分块频数统计") start_row <- 1 # 用walk遍历变量,执行写入操作 walk(styl_vars, function(var) { dt <- tested_data %>% group_by(.data[[var]]) %>% count(name = "频数") %>% ungroup() %>% rename(!!var := `.data[[var]]`) writeData(wb, sheet = "分块频数统计", x = var, startRow = start_row, startCol = 1) start_row <<- start_row + 1 # 用<<-修改外部环境的起始行变量 writeData(wb, sheet = "分块频数统计", x = dt, startRow = start_row, startCol = 1) start_row <<- start_row + nrow(dt) + 1 }) saveWorkbook(wb, "STYL分块频数统计.xlsx", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者cutifire
相关产品推荐
相关产品推荐

