ggplot与summarise未按day和group分组生成统计量问题
问题解决:分组汇总异常及柱状图绘制修正
错误原因
你的代码中summarise函数的写法有误:na.rm = TRUE被当成了新列的定义,而非mean()函数的参数。这会导致生成冗余列,且若数据中存在未被过滤的NA时,均值计算会出错,最终可能导致分组汇总结果异常。
修正后的完整代码
study_id <- c(1,2,3,4,5,6) group <- c(1,2,1,2,1,2) mass_day1 <-c(NA,2,NA,3,NA,1) mass_day2 <- c(15,15,15,15,NA,15) mass_day3 <-c(3,3,3,3,3,3) mass_day4 <- c(4,4,4,NA,4,4) drink_df <- data.frame(study_id,group,mass_day4,mass_day3,mass_day2,mass_day1) # 数据转换与分组汇总(修正核心部分) drink_dfa <- drink_df %>% pivot_longer(cols = starts_with("mass"), names_to = c(".value", "day"), names_pattern = '(.*)_(.*)', values_drop_na = TRUE) %>% dplyr::group_by(day,group) %>% summarise(mass = mean(mass, na.rm = TRUE)) %>% # 将na.rm放入mean函数内 ungroup() %>% mutate(day = factor(day, levels = paste0("day", 1:4))) # 按day1-day4排序x轴 # 绘制柱状图 plot <- ggplot(drink_dfa, aes(x = day, y = mass, fill = factor(group))) + geom_bar(stat="identity", position=position_dodge(width=0.8), na.rm = FALSE) + labs(x = "天数", y = "平均质量", fill = "分组") + theme_minimal() print(plot)
关键修正点说明
- 汇总逻辑修正:将
na.rm = TRUE移入mean()函数参数中,确保均值计算时正确忽略NA(即使pivot_longer已过滤NA,这也是更健壮的写法)。 - x轴顺序调整:通过
mutate将day转换为有序因子,避免原始数据中day4-day1的倒序显示,符合常规阅读习惯。 - 分组可视化优化:将
group转换为因子,让填充色图例更清晰,同时调整position_dodge的宽度,让分组柱子间距更合理。
内容的提问来源于stack exchange,提问作者GJW
相关产品推荐
相关产品推荐

