在R中生成按性别划分的吸烟状态百分比表格遇阻
解决方案
你的问题主要有两个原因:一是原代码中sum(count1)的计算范围错误(在cigarettes_smoking_status + sex的分组下,每个分组的总和就是自身计数,导致百分比全为100%);二是示例数据缺少两个目标吸烟状态类别,需要先把变量转为包含所有4个水平的因子,才能让这两行显示在结果中。
以下是两种可行的实现方法:
方法一:用tidyverse管道流实现
library(tidyverse) # 先将吸烟状态转为包含所有4个目标类别的因子,确保缺失类别也会显示 smoking_dataset$cigarettes_smoking_status <- factor( smoking_dataset$cigarettes_smoking_status, levels = c("Occasional Smoker", "Non-smoker", "Regular Smoker", "Prefer not to say") ) # 生成按吸烟状态分组的性别占比表格 smoking_status_by_per <- smoking_dataset %>% group_by(cigarettes_smoking_status, sex) %>% summarise(count = n(), .groups = "drop_last") %>% # 保留吸烟状态的分组 mutate(percentage = round((count / sum(count)) * 100, 1)) %>% # 计算行内占比并保留1位小数 pivot_wider( names_from = sex, values_from = percentage, values_fill = 0 # 缺失的性别占比填充为0 ) %>% ungroup() # 查看结果 smoking_status_by_per
运行后输出会包含你需要的4行,每行对应一个吸烟状态,列显示男女的占比。
方法二:用janitor包快速生成(更简洁)
library(janitor) library(tidyverse) # 同样先处理因子水平 smoking_dataset$cigarettes_smoking_status <- factor( smoking_dataset$cigarettes_smoking_status, levels = c("Occasional Smoker", "Non-smoker", "Regular Smoker", "Prefer not to say") ) # 生成带百分比的交叉表 smoking_tab <- smoking_dataset %>% tabyl(cigarettes_smoking_status, sex) %>% adorn_percentages("row") %>% # 按行(吸烟状态)计算性别占比 adorn_pct_formatting(digits = 1) %>% # 格式化为百分比字符串 adorn_ns() # 可选:同时显示原始计数和百分比 smoking_tab
这个方法会直接生成可读性更强的表格,同时保留原始计数和百分比。
内容的提问来源于stack exchange,提问作者Matthew Sutherland
相关产品推荐
相关产品推荐

