如何在R中将工作日按周日为起始进行排序?
解决R中按周日起始排序工作日的问题
核心思路
weekdays()生成的是字符型向量,ggplot默认按字母顺序排序。要实现自定义顺序,需要将weekDay列转为有序因子,指定从周日开始的星期顺序。
具体修改方案
方法1:直接定义有序因子(推荐)
修改数据处理代码,把weekDay转为有序因子,手动指定周日开头的星期顺序(注意匹配你的系统语言,中文环境用中文星期名,英文环境用英文):
library(dplyr) library(lubridate) library(ggplot2) # 将星期转为有序因子,指定周日为起始 my_dataset <- my_dataset %>% mutate(weekDay = factor(weekdays(Date), levels = c("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"), ordered = TRUE)) # 修正绘图代码的y轴字段(原代码中steps应为mean_steps) my_dataset %>% group_by(weekDay) %>% summarise(mean_steps = mean(TotalSteps, na.rm = TRUE)) %>% # 加入na.rm处理缺失值 ggplot(aes(x = weekDay, y = mean_steps))+ geom_bar(stat = "identity")
方法2:利用lubridate的wday函数排序
wday()函数默认返回的数值中,周日为1、周一为2……周六为7,刚好符合你的排序需求,可通过该数值映射星期顺序:
my_dataset <- my_dataset %>% mutate(week_num = wday(Date), # 生成周日=1、周六=7的数值 weekDay = weekdays(Date)) # 按星期数值分组汇总,绘图时用reorder指定x轴顺序 my_dataset %>% group_by(week_num, weekDay) %>% summarise(mean_steps = mean(TotalSteps, na.rm = TRUE)) %>% ggplot(aes(x = reorder(weekDay, week_num), y = mean_steps))+ geom_bar(stat = "identity")+ labs(x = "weekDay") # 修正x轴标签
注意事项
- 确保
levels中的星期名称与系统语言完全匹配,否则因子匹配会失效。 - 原代码中
ggplot的y轴字段steps应为汇总后的mean_steps,需修正避免报错。 - 建议在
mean()中加入na.rm = TRUE,防止缺失值导致结果为NA。
内容的提问来源于stack exchange,提问作者Anderson Freitas
相关产品推荐
相关产品推荐

