如何将tabyl函数生成的分类变量统计结果保存至Excel单个工作表?
将tabyl统计结果保存到Excel单个工作表
要把所有分类变量的tabyl统计结果存入同一个Excel工作表,你可以通过整理列表结果并拼接,再用openxlsx包写入文件,以下是两种实用方案:
方案1:按变量独立表格依次排列(带分隔)
这种方式保留每个变量的tabyl原生格式,用变量名和空行区分不同变量的统计结果,可读性强:
# 加载所需包 library(janitor) library(openxlsx) # 你的原始数据 dat <- structure(list(ID = c(55L, 67L, 83L, 78L, 43L, 29L), color1 = c("red", "yellow", "blue", "red", "green", "yellow"), color2 = c("blue", NA, "yellow", "yellow", NA, "green"), color3 = c(NA, NA, NA, "blue", NA, NA), shape1 = c("circle", "triangle", "circle", "square", "square", "circle"), shape2 = c("triangle", NA, NA, "circle", "circle", "triangle"), size = c("small", "medium", "large", "large", "small", "medium")), class = "data.frame", row.names = c(NA, -6L)) # 生成所有变量的tabyl统计列表 tabyl_list <- lapply(dat, function(x) tabyl(x)) # 格式化每个统计表格:添加变量名标题,拼接时加空行分隔 formatted_tables <- lapply(names(tabyl_list), function(var_name) { tab <- tabyl_list[[var_name]] # 生成变量名标题行 header <- data.frame(!!var_name := var_name, n = "", percent = "", stringsAsFactors = FALSE) # 合并标题和统计表格 rbind(header, tab) }) # 拼接所有表格,每个表格后加空行 combined_table <- do.call(rbind, lapply(formatted_tables, function(tbl) { rbind(tbl, data.frame(matrix(ncol = ncol(tbl), nrow = 1))) })) # 移除最后一行多余的空行 combined_table <- combined_table[-nrow(combined_table), ] # 写入Excel文件 write.xlsx(combined_table, "分类变量统计结果.xlsx", sheetName = "统计汇总", rowNames = FALSE)
方案2:统一长格式整理
这种方式将所有变量的统计结果转换成标准长表格,适合后续批量处理或筛选:
# 加载所需包 library(janitor) library(dplyr) library(tidyr) library(openxlsx) # 仅筛选分类变量(跳过ID这类数值型),整理成统一格式 combined_results <- dat %>% select(where(is.character)) %>% pivot_longer(everything(), names_to = "变量名", values_to = "类别") %>% tabyl(`变量名`, 类别) %>% adorn_percentages("row") %>% adorn_pct_formatting(digits = 2) %>% adorn_ns() %>% pivot_longer(-`变量名`, names_to = "类别", values_to = "统计结果") %>% separate(`统计结果`, into = c("观测数", "百分比"), sep = " \\(") %>% mutate(百分比 = gsub("\\)", "", 百分比)) # 写入Excel文件 write.xlsx(combined_results, "分类变量统计结果.xlsx", sheetName = "统计汇总", rowNames = FALSE)
注意事项
- 如果不需要包含
ID这类数值变量的统计,在生成tabyl_list时可以先筛选变量:lapply(select(dat, where(is.character)), function(x) tabyl(x)) openxlsx包支持自定义Excel样式,如果需要美化表格,可以添加createStyle相关代码调整字体、边框等。
内容的提问来源于stack exchange,提问作者ElR
相关产品推荐
相关产品推荐

