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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:47:24