使用datasummary实现因子N与占比同列展示并整合定量变量统计
解决datasummary分组展示因子计数百分比与定量变量均值标准差的整合问题
一、修复计数(N)与百分比合并函数
你之前的NP函数存在语法和逻辑错误,修正后的版本可以正确实现计数与百分比的同列展示:
NP <- function(x) { # 计算非缺失值的样本量 n <- sum(!is.na(x)) # 计算分组内的百分比(基于当前分组的总样本量) p <- 100 * n / length(x) # 拼接成「计数 (百分比%)」格式,保留2位小数 paste0(n, " (", round(p, 2), "%)") }
二、生成因子变量统计表格
使用修正后的NP函数,直接在datasummary中调用即可得到同列展示的计数与百分比:
tbl_1 <- datasummary( (Heading("")*NP)*(Gender + Job) ~ Species, data = iris_tab1, fmt = 2, output = 'data.frame' )
三、为定量变量表格补全空列并合并
要让定量变量表格与因子表格结构对齐,只需在生成后手动添加对应空列,再合并两个表格:
# 生成定量变量的均值标准差表格 tbl_2 <- datasummary( Heading("")*MeanSD*Length ~ Species, data = iris_tab1, output = 'data.frame' ) # 添加空行标题列,与tbl_1结构对齐 tbl_2 <- tibble( ` ` = "Length", # 行标题设为Length tbl_2 ) # 合并两个表格 final_tbl <- rbind(tbl_1, tbl_2)
完整可运行代码
library(modelsummary) library(magrittr) library(dplyr) set.seed(123) iris$gender <- factor(sample(1:3, size = 150, replace = T), labels = c("Male", "Female", "Other")) iris$job <- factor(sample(1:5, size = 150, replace = T), labels = c("Student", "Worker", "CEO", "Other", "None")) # 均值标准差合并函数 MeanSD <- function(x) { M <- mean(x, na.rm = T) SD <- sd(x, na.rm = T) paste0(round(M, 2), " (", round(SD, 2), ")") } # 修复后的计数百分比合并函数 NP <- function(x) { n <- sum(!is.na(x)) p <- 100 * n / length(x) paste0(n, " (", round(p, 2), "%)") } # 整理数据 iris_tab1 <- iris %>% dplyr::select(Species, Gender = gender, Job = job, Length = Sepal.Length) # 生成因子变量统计表格 tbl_1 <- datasummary( (Heading("")*NP)*(Gender + Job) ~ Species, data = iris_tab1, fmt = 2, output = 'data.frame' ) # 生成定量变量统计表格并补全结构 tbl_2 <- datasummary( Heading("")*MeanSD*Length ~ Species, data = iris_tab1, output = 'data.frame' ) %>% mutate(` ` = "Length", .before = 1) # 合并最终表格 final_tbl <- rbind(tbl_1, tbl_2) # 查看结果 final_tbl
结果说明
最终的final_tbl会按Species分组展示:
- Gender、Job各水平的计数与百分比(同列)
- Length的均值与标准差(同列)
- 所有统计结果整合为一个结构整齐的表格
内容的提问来源于stack exchange,提问作者statleo
相关产品推荐
相关产品推荐

