如何用R自动生成指定格式的离散/连续变量汇总表?
实现R中自动生成指定格式的统计汇总表
核心方案
通过自定义函数结合变量分组,自动批量处理离散和连续变量,生成符合要求的统计格式,无需手动逐个输入变量名。
完整代码实现
# 加载依赖包 library(dplyr) # 示例数据集 set.seed(123) data <- data.frame( ChildSex = sample(c("Male", "Female"), 5006, replace = TRUE), col1 = rnorm(5006, mean = 300, sd = 100), col2 = rnorm(5006, mean = 400, sd = 150), col3 = rnorm(5006, mean = 470, sd = 200) ) # 1. 定义变量分组(根据实际需求替换列名) discrete_vars <- c("ChildSex") cont_mean_vars <- c("col1", "col2") cont_median_vars <- c("col3") # 2. 处理离散变量:生成n/N(%)格式 process_discrete <- function(data, var) { var_name <- gsub("([A-Z])", " \\1", var) # 变量名格式化为空格分隔(如ChildSex→Child sex) total_n <- nrow(data) # 计算各水平频数 freq_table <- data %>% count(.data[[var]], name = "n") %>% mutate( pct = round(n / total_n * 100, 0), stat = sprintf("%d/%d (%d%%)", n, total_n, pct) ) # 补充缺失值统计 missing_n <- sum(is.na(data[[var]])) missing_row <- tibble( .data[[var]] = "Data missing", n = missing_n, pct = round(missing_n / total_n * 100, 0), stat = sprintf("%d /%d (%d%%)", missing_n, total_n, pct) ) # 组合结果并格式化输出文本 result <- bind_rows(freq_table, missing_row) %>% mutate( line = ifelse(row_number() == 1, sprintf("%-30s", var_name), sprintf(" %-27s %s", .data[[var]], stat)) ) return(result$line) } # 3. 处理连续变量:mean(SD); N格式 process_cont_mean <- function(data, var) { var_name <- toupper(substr(var, 1, 1)) %>% paste0(substr(var, 2, nchar(var))) # 首字母大写(col1→Col1) mean_val <- round(mean(data[[var]], na.rm = TRUE), 2) sd_val <- round(sd(data[[var]], na.rm = TRUE), 2) valid_n <- sum(!is.na(data[[var]])) stat <- sprintf("%.2f (%.2f); %d", mean_val, sd_val, valid_n) return(sprintf(" %-27s %s", var_name, stat)) } # 4. 处理连续变量:median(IQR); N格式 process_cont_median <- function(data, var) { var_name <- toupper(substr(var, 1, 1)) %>% paste0(substr(var, 2, nchar(var))) med_val <- round(median(data[[var]], na.rm = TRUE), 2) iqr_val <- round(IQR(data[[var]], na.rm = TRUE), 2) valid_n <- sum(!is.na(data[[var]])) stat <- sprintf("%.2f (%.2f); %d", med_val, iqr_val, valid_n) return(sprintf(" %-27s %s", var_name, stat)) } # 5. 组合所有结果并输出 cat("Discrete Variables\n") for (var in discrete_vars) { cat(paste(process_discrete(data, var), collapse = "\n"), "\n\n") } cat("Continuous Variables: mean (SD); N\n") for (var in cont_mean_vars) { cat(process_cont_mean(data, var), "\n") } cat("\n") cat("Continuous Variables: median (IQR); N\n") for (var in cont_median_vars) { cat(process_cont_median(data, var), "\n") }
代码说明
- 变量分组:手动指定三类变量的列名,避免自动识别类型时出现误差(比如字符型连续变量误判),适配你20个离散、30个连续变量的需求。
- 离散变量处理:自动格式化变量名(驼峰转空格分隔),计算各水平频数、占比,补充缺失值统计,输出对齐的文本格式。
- 连续变量处理:分别生成均数(标准差)、中位数(四分位距)格式,自动保留两位小数,统计有效样本量,输出对齐文本。
- 输出格式:通过
sprintf实现文本对齐,用cat函数拼接输出,完全匹配你期望的格式。
内容的提问来源于stack exchange,提问作者Science11
相关产品推荐
相关产品推荐

