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

如何用R重塑帕金森病与对照组用药数据并绘制柱状图?

帕金森病患者与对照组药物使用频次统计及可视化解决方案

需求说明

  • 数据集:包含约200例帕金森病(PD)患者和200例对照组的微生物组大型数据集
  • 核心目标:
    1. 统计PD组与对照组中每种药物的"Y(是)"响应次数,整理为规范格式表格
    2. 绘制分组柱状图:X轴为药物名称,Y轴为"Y"响应频次,按PD/对照组分组对比

尝试的无效代码

# 尝试提取药物列
data2 <- Source_Data_24Oct2022 %>%
  select(, 37:55) %>%
  View()

# 筛选分组并选择药物变量
data3 <- Source_Data_24Oct2022 %>%
  filter(Case_status %in% c("PD", "Control")) %>%
  select(Case_status, Antibiotics_current, Antibiotics_past_3_months, Laxatives, Indigestion_drugs, Anti_inflammatory_drugs, Radiation_Chemo, Blood_thinners, Cholesterol_med, Blood_pressure_med, Thyroid_med, Asthma_or_COPD_med, Diabetes_med, Pain_med, Depression_anxiety_mood_med, Birth_control_or_estrogen, Antihistamines, Probiotic, Co_Q_10, Sleep_aid) %>%
  View()

# 重塑数据并统计,但结果不符合预期
data4 <- data3 %>%
  pivot_longer(cols = 2:20, names_to = "Drug", values_to = "Response") %>%
  filter(Response == "Y") %>%
  group_by(Case_status) %>%
  summarise(count = n()) %>%
  View()

同事的症状统计参考代码

tidy_data <- Book3 %>%
  filter(Case_status %in% c("PD", "Control")) %>%
  select(starts_with("Day_of_stool_collection_"), Case_status, Constipation, Diarrhea, Intestinal_disease) %>%
  pivot_longer(cols = -Case_status, names_to = "Symptom", values_to = "Response") %>%
  filter(Response == "Y") %>%
  group_by(Case_status, Symptom) %>%
  summarise(Count = n())

ggplot(tidy_data, aes(x = Symptom, y = Count, fill = Case_status)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Frequency of 'Yes' Responses for Symptoms in PD and Control Groups",
    x = "Symptoms", y = "Frequency of 'Yes' Responses"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

问题分析与正确代码实现

问题根源

原代码的核心错误是仅按Case_status分组统计,没有同时按Drug分组,导致最终只得到两组所有药物的总"Y"响应数,而非每种药物的单独频次。

正确代码

# 加载所需包(确保已安装tidyverse)
library(tidyverse)

# 数据处理:筛选分组、重塑数据、统计每种药物的Y响应频次
tidy_drug_data <- Source_Data_24Oct2022 %>%
  # 筛选PD和对照组
  filter(Case_status %in% c("PD", "Control")) %>%
  # 选择分组变量和所有药物列
  select(Case_status, Antibiotics_current, Antibiotics_past_3_months, Laxatives, Indigestion_drugs, Anti_inflammatory_drugs, Radiation_Chemo, Blood_thinners, Cholesterol_med, Blood_pressure_med, Thyroid_med, Asthma_or_COPD_med, Diabetes_med, Pain_med, Depression_anxiety_mood_med, Birth_control_or_estrogen, Antihistamines, Probiotic, Co_Q_10, Sleep_aid) %>%
  # 将宽格式转为长格式:把每个药物列转为Drug-Response对
  pivot_longer(cols = -Case_status, names_to = "Drug", values_to = "Response") %>%
  # 只保留响应为Y的记录
  filter(Response == "Y") %>%
  # 按分组和药物名称分组,统计频次
  group_by(Case_status, Drug) %>%
  summarise(Count = n(), .groups = "drop") # 清除分组属性,避免后续问题

# 查看处理后的规范表格
View(tidy_drug_data)

# 绘制分组柱状图
ggplot(tidy_drug_data, aes(x = Drug, y = Count, fill = Case_status)) +
  # 分组并排柱状图,优化柱子间距
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  # 设置图表标题与坐标轴标签
  labs(
    title = "PD患者与对照组药物使用'是'响应频次对比",
    x = "药物名称",
    y = "'是'响应频次",
    fill = "分组"
  ) +
  # 美化X轴标签,避免长名称重叠
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
        plot.title = element_text(hjust = 0.5))

代码说明

  1. 数据处理部分:

    • 保留分组变量与所有药物列,转为长格式后按Case_status+Drug双维度分组,确保每个药物在两组中的频次被单独计算
    • .groups = "drop"用于清除分组残留属性,避免后续绘图出现异常
  2. 可视化部分:

    • position_dodge(width=0.8)优化柱子间距,避免两组柱子重叠
    • 调整X轴标签角度与对齐方式,解决长药物名称的显示问题
    • 中文标签更贴合毕业论文的展示需求

内容的提问来源于stack exchange,提问作者Natasha Hajaig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:17:22