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

如何用dplyr和qwraps2生成多分类变量计数百分比合并表格

分类变量计数与百分比整合表格解决方案

需求说明

处理包含多分类变量的数据集,生成格式为「计数(百分比%)」的汇总表格,当前代码分别生成计数和百分比,需整合为美观的单一表格。

数据集与现有代码

数据集样本

DLO_TEST <- structure(list(SIDE = c("Left", "Right", "Left", "Right", "Left", 
"Right", "Right", "Right", "Right", "Right", "Left", "Left", 
"Left", "Right", "Left", "Right", "Right", "Left", "Left", "Left", 
"Left", "Right", "Right"), PREOP_mTFA = c(163.5, 164.9, 168.7, 
170.3, 162.8, 166.7, 171, 165.9, 165.9, 170.8, 170.5, 173.3, 
167.7, 170.7, 159, 170.9, 168.2, 171.2, 164, 166.6, 169.1, 171.2, 
175.9), PREOP_mLDFA = c(86, 95, 90, 86, 92, 89, 92, 96, 90, 86, 
89, 87, 93, 90, 98, 89, 90, 88, 92, 91, 89, 90, 88), KL = c("ONE", 
"THREE", "TWO", "FOUR", "FOUR", "FOUR", "THREE", "TWO", "ONE", 
"ONE", "TWO", "TWO", "TWO", "THREE", "ONE", "FOUR", "TWO", "THREE", 
"THREE", "TWO", "ONE", "TWO", "TWO"), WEDGE = c("OWHTO", "CWHTO", 
"OWHTO", "CWHTO", "OWDFO", "OWDFO", "CWDFO", "CWDFO", "CWDFO", 
"OWDFO", "OWHTO", "MOWHTO", "LCWHTO", "LCWHTO", "LCWHTO", "LCWHTO", 
"MOWHTO", "LCWDFO", "MOWDFO", "MCWDFO", "MCWDFO", "LOWDFO", "LOWDFO"
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-23L))

现有代码(拆分生成计数与百分比)

library(dplyr)
library(qrwraps2)

# 单独生成SIDE的计数与百分比
DLO_TEST %>% group_by(SIDE) %>% 
  summarise(count = n())
DLO_TEST %>% group_by(SIDE) %>% 
  summarise(percent = 100 * n() / nrow(DLO_TEST))

# 单独生成KL的计数与百分比
DLO_TEST %>% group_by(KL) %>% 
  summarise(count = n())
DLO_TEST %>% group_by(KL) %>% 
  summarise(percent = 100 * n() / nrow(DLO_TEST))

# 单独生成WEDGE的计数与百分比
DLO_TEST %>% group_by(WEDGE) %>% 
  summarise(count = n())
DLO_TEST %>% group_by(WEDGE) %>% 
  summarise(percent = 100 * n() / nrow(DLO_TEST))

解决方案

方法1:用dplyr直接整合计数与百分比

在summarise中同时计算计数和百分比,拼接成要求的格式,还可以批量处理所有分类变量:

library(dplyr)

# 处理单个变量示例
DLO_TEST %>%
  group_by(SIDE) %>%
  summarise(n_percent = paste0(n(), " (", round(100 * n() / nrow(DLO_TEST), 1), "%)")) %>%
  ungroup()

# 批量处理所有分类变量
# 定义需要处理的分类变量列表
cat_vars <- c("SIDE", "KL", "WEDGE")

# 循环生成每个变量的汇总并合并
combined_table <- lapply(cat_vars, function(var) {
  DLO_TEST %>%
    group_by(!!sym(var)) %>%
    summarise(n_percent = paste0(n(), " (", round(100 * n() / nrow(DLO_TEST), 1), "%)")) %>%
    ungroup() %>%
    rename(类别 = !!sym(var)) %>%
    mutate(变量 = var) %>%
    select(变量, 类别, n_percent)
}) %>% bind_rows()

# 查看合并后的表格
print(combined_table)

该方法输出的表格会将所有分类变量的汇总结果整合到同一表格,便于统一查看。

方法2:用qwraps2生成结构化统计表格

qwraps2专门用于生成符合学术/医学风格的汇总表格,n_perc函数可直接生成「计数(百分比%)」格式:

library(qrwraps2)

# 设置输出为Markdown格式(适配R Markdown)
options(qwraps2_markup = "markdown")

# 定义各变量的汇总规则
summary_specs <- list(
  "手术侧 (SIDE)" = list(
    "左侧" = ~ n_perc(SIDE == "Left"),
    "右侧" = ~ n_perc(SIDE == "Right")
  ),
  "KL分级 (KL)" = list(
    "ONE" = ~ n_perc(KL == "ONE"),
    "TWO" = ~ n_perc(KL == "TWO"),
    "THREE" = ~ n_perc(KL == "THREE"),
    "FOUR" = ~ n_perc(KL == "FOUR")
  ),
  "楔形截骨方式 (WEDGE)" = list(
    "OWHTO" = ~ n_perc(WEDGE == "OWHTO"),
    "CWHTO" = ~ n_perc(WEDGE == "CWHTO"),
    "OWDFO" = ~ n_perc(WEDGE == "OWDFO"),
    "CWDFO" = ~ n_perc(WEDGE == "CWDFO"),
    "MOWHTO" = ~ n_perc(WEDGE == "MOWHTO"),
    "LCWHTO" = ~ n_perc(WEDGE == "LCWHTO"),
    "LCWDFO" = ~ n_perc(WEDGE == "LCWDFO"),
    "MOWDFO" = ~ n_perc(WEDGE == "MOWDFO"),
    "MCWDFO" = ~ n_perc(WEDGE == "MCWDFO"),
    "LOWDFO" = ~ n_perc(WEDGE == "LOWDFO")
  )
)

# 生成汇总表格
final_table <- summary_table(DLO_TEST, summary_specs)

# 在R Markdown中直接输出表格
final_table

该方法生成的表格层级清晰,直接适配R Markdown的输出格式,无需额外调整。

方法3:用janitor包快速生成(可选)

若允许额外安装包,janitor的tabyl函数可一键生成计数与百分比,再拼接格式:

install.packages("janitor")
library(janitor)
library(dplyr)

# 单个变量处理
DLO_TEST %>%
  tabyl(SIDE) %>%
  mutate(percent = round(percent * 100, 1)) %>%
  mutate(n_percent = paste0(n, " (", percent, "%)")) %>%
  select(SIDE, n_percent)

# 批量处理分类变量
cat_vars <- c("SIDE", "KL", "WEDGE")
combined_tabyl <- lapply(cat_vars, function(var) {
  DLO_TEST %>%
    tabyl(!!sym(var)) %>%
    mutate(percent = round(percent * 100, 1)) %>%
    mutate(n_percent = paste0(n, " (", percent, "%)")) %>%
    rename(类别 = !!sym(var)) %>%
    mutate(变量 = var) %>%
    select(变量, 类别, n_percent)
}) %>% bind_rows()

print(combined_tabyl)

内容的提问来源于stack exchange,提问作者Ahmed Mabrouk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:09:51