使用R dplyr将月度日期分类为带序号的Mon/Weekdays/Fri/Weekend因子
实现代码
你可以通过dplyr+lubridate组合实现需求,完整代码如下:
# 加载依赖包 library(dplyr) library(lubridate) # 你原有的样本生成代码 sample_dates <- data.frame(date = c("2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05", "2021-01-06", "2021-01-07", "2021-01-08", "2021-01-09", "2021-01-10", "2021-01-11", "2021-01-12", "2021-01-13", "2021-01-14", "2021-01-15", "2021-01-16", "2021-01-17", "2021-01-18", "2021-01-19", "2021-01-20", "2021-01-21", "2021-01-22", "2021-01-23", "2021-01-24", "2021-01-25", "2021-01-26", "2021-01-27", "2021-01-28", "2021-01-29", "2021-01-30", "2021-01-31")) sample_dates <- sample_dates %>% mutate(date = as.POSIXct(date)) %>% mutate(day = factor(format(date, "%a"))) # 新增day_cat变量的核心逻辑 sample_dates <- sample_dates %>% mutate( # 提取星期数值:1=周日、2=周一、3=周二、4=周三、5=周四、6=周五、7=周六 weekday_num = wday(date), # 定义基础分类 base_cat = case_when( weekday_num == 2 ~ "Mon", weekday_num %in% c(3,4,5) ~ "Weekdays", weekday_num == 6 ~ "Fri", weekday_num %in% c(1,7) ~ "Weekend" ), # 计算周期序号:每遇到一次周一序号+1,月初非周一开头的部分统一归为第1周期 cycle_num = cumsum(weekday_num == 2) + 1, cycle_num = if_else(row_number() == 1 & weekday_num != 2, 1, cycle_num), # 拼接得到day_cat day_cat = paste0(base_cat, cycle_num), # 按要求设置因子水平,满足绘图排序需求 day_cat = factor( day_cat, levels = c( paste0("Mon", sort(unique(cycle_num))), paste0("Weekdays", sort(unique(cycle_num))), paste0("Fri", sort(unique(cycle_num))), paste0("Weekend", sort(unique(cycle_num))) ) ) )
效果验证
以你提供的2021年1月样本为例,生成的day_cat前10条结果完全符合预期:
| date | day | day_cat |
|---|---|---|
| 2021-01-01 | Fri | Fri1 |
| 2021-01-02 | Sat | Weekend1 |
| 2021-01-03 | Sun | Weekend1 |
| 2021-01-04 | Mon | Mon2 |
| 2021-01-05 | Tue | Weekdays2 |
| 2021-01-06 | Wed | Weekdays2 |
| 2021-01-07 | Thu | Weekdays2 |
| 2021-01-08 | Fri | Fri2 |
| 2021-01-09 | Sat | Weekend2 |
| 2021-01-10 | Sun | Weekend2 |
该实现支持任意月份起始/结束日期的场景,自动匹配周期序号,不需要手动指定月初星期。
内容的提问来源于stack exchange,提问作者Pramesh Pudasaini
相关产品推荐
相关产品推荐

