如何用R重塑帕金森病与对照组用药数据并绘制柱状图?
帕金森病患者与对照组药物使用频次统计及可视化解决方案
需求说明
- 数据集:包含约200例帕金森病(PD)患者和200例对照组的微生物组大型数据集
- 核心目标:
- 统计PD组与对照组中每种药物的"Y(是)"响应次数,整理为规范格式表格
- 绘制分组柱状图: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))
代码说明
数据处理部分:
- 保留分组变量与所有药物列,转为长格式后按
Case_status+Drug双维度分组,确保每个药物在两组中的频次被单独计算 .groups = "drop"用于清除分组残留属性,避免后续绘图出现异常
- 保留分组变量与所有药物列,转为长格式后按
可视化部分:
position_dodge(width=0.8)优化柱子间距,避免两组柱子重叠- 调整X轴标签角度与对齐方式,解决长药物名称的显示问题
- 中文标签更贴合毕业论文的展示需求
内容的提问来源于stack exchange,提问作者Natasha Hajaig
相关产品推荐
相关产品推荐

