You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:26:02