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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:55:21