如何在R中根据菜单的日期范围与星期规则生成日期-菜单映射表
菜单日期匹配解决方案
问题背景
我有一个包含菜单选项、生效星期、适用日期范围的DataFrame,示例代码如下:
df <- rbind( c("A",1,1,0,1,1,0,0, "20240101", "20240107"), c("B",1,1,0,1,1,0,0, "20240108", "20240114"), c("C",0,0,1,0,0,0,0, "20240101", "20240107"), c("D",0,0,1,0,0,0,0, "20240108", "20240114"), c("E",1,1,1,1,1,1,1, "20240101", "20240114")) |> as.data.frame() names(df) <- c("menu","monday", "tuesday","wednesday", "thursday", "friday", "saturday","sunday", "start", "end") df$start <- as.Date(df$start, format = "%Y%m%d") df$end <- as.Date(df$end, format = "%Y%m%d")
希望生成一个包含date和menu两列的新DataFrame,示例格式如下:
DATE MENU 2024-01-01 A 2024-01-01 E 2024-01-02 A 2024-01-02 E 2024-01-03 C 2024-01-03 E 2024-01-04 A 2024-01-04 E ...
我已经生成了日期列表和对应的星期信息,但不知道如何继续完成需求,需要解决方案。
解决方案
可以通过以下步骤实现:
- 生成所有目标日期序列:先确定整个时间范围的起始和结束日期,生成完整的日期序列,同时添加每个日期对应的星期标识。
- 将菜单的星期规则转换为长格式:把原DataFrame中每个菜单的星期列(monday到sunday)转换为长格式,方便后续匹配。
- 匹配日期与菜单:结合日期范围和星期规则,筛选出每个日期符合条件的菜单。
完整代码如下:
# 加载必要包 library(dplyr) library(tidyr) # 生成完整日期序列并添加星期信息 all_dates <- tibble(date = seq(min(df$start), max(df$end), by = "day")) %>% mutate(weekday = tolower(weekdays(date))) # 转换为小写,和原列名匹配 # 将菜单数据转换为长格式,提取生效星期 menu_weekdays <- df %>% pivot_longer(cols = monday:sunday, names_to = "weekday", values_to = "active") %>% filter(active == 1) %>% # 只保留生效的星期 select(-active) # 匹配日期与菜单,同时筛选日期范围 result <- all_dates %>% left_join(menu_weekdays, by = "weekday") %>% filter(date >= start & date <= end) %>% select(date, menu) %>% arrange(date, menu) # 按日期和菜单排序 # 查看结果 head(result)
代码说明
all_dates:生成从最早开始日期到最晚结束日期的所有日期,并用weekdays()函数获取每个日期的星期,转换为小写后与原DataFrame的星期列名匹配。menu_weekdays:用pivot_longer将宽格式的星期列转为长格式,只保留active为1的记录(即菜单生效的星期)。result:通过星期列关联日期和菜单,再筛选日期在菜单的start和end范围内的记录,最后整理成所需的两列格式并排序。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

