在R中按性别分组自动生成含均数(SD)/频数(百分比)的统计表格
按性别分组统计并生成指定格式表格的R实现
1. 加载所需工具包
我们使用dplyr完成数据分组统计,gt生成符合要求的表格样式:
# 未安装则先执行安装 install.packages(c("dplyr", "gt")) library(dplyr) library(gt)
2. 导入并预处理数据集
先将数据集加载到R环境,同时给性别变量添加清晰的分类标签:
# 导入用户提供的数据集 data <- structure(list(age = c(23, 25, 60, 12), sex = c(0, 1, 0, 1), bmi = c(25, 30, 23, 24), disease = c(0, 1, 0, 1)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L)) # 替换性别编码为文字标签 data <- data %>% mutate(sex = case_when( sex == 0 ~ "女性", sex == 1 ~ "男性" ))
3. 编写自动识别变量类型的统计函数
这个函数会自动判断变量是连续型还是二分类型,输出对应的统计结果:
get_stats <- function(var, group_var) { # 连续变量(数值型且唯一值数量>2):输出均数±标准差 if (is.numeric(var) & length(unique(var)) > 2) { var %>% group_by({{group_var}}) %>% summarise(stat = sprintf("%.1f±%.1f", mean(.), sd(.))) %>% pivot_wider(names_from = {{group_var}}, values_from = stat) } else { # 二分类变量:输出disease=1的频数(百分比) var %>% enframe(name = NULL) %>% mutate(value = as.integer(value == 1)) %>% group_by({{group_var}}) %>% summarise( n = sum(value), pct = sprintf("%.1f%%", mean(value)*100) ) %>% mutate(stat = sprintf("%d(%s)", n, pct)) %>% select(-n, -pct) %>% pivot_wider(names_from = {{group_var}}, values_from = stat) } }
4. 批量处理变量并合并统计结果
对目标变量(年龄、BMI、患病情况)批量应用统计函数,合并成统一的结果表:
results <- bind_rows( get_stats(data$age, data$sex) %>% mutate(variable = "年龄"), get_stats(data$bmi, data$sex) %>% mutate(variable = "BMI"), get_stats(data$disease, data$sex) %>% mutate(variable = "患病情况") ) %>% relocate(variable, .before = everything())
5. 生成示例样式的表格
用gt包渲染出符合要求的表格:
results %>% gt() %>% cols_label( variable = "特征", 女性 = "女性", 男性 = "男性" ) %>% tab_header( title = "按性别分组的特征统计" ) %>% tab_options( table.width = px(400), header.background.color = "#f0f0f0", table.border.top.style = "solid", table.border.bottom.style = "solid" )
运行上述代码后,将得到和示例样式一致的表格:连续变量展示均数±标准差,二分类变量展示患病的频数与百分比,且按性别分组呈现。
内容的提问来源于stack exchange,提问作者user19745561
相关产品推荐
相关产品推荐

