如何使用一些定义的逻辑根据特定日期范围及其值查找每个星期二

How to find every Tuesday week based on particular date range along with it's value using some defined logic

对于任何特定的日期范围,我需要

每个月第一个星期二的平均值 每个月第二周星期二的平均值 每个月第 3 周星期二的平均值

对于第 4 周的星期二和第 5 周的星期二,逻辑需要是这样的 如果这个月只有 4 个星期二那么就作为最后一周,但是如果这个月有 5 个星期 那么需要遵循如下逻辑

如果该月有第 5 个星期二,即 3 月和 6 月的最后一周, 其他月份有 4 周作为他们的最后一周,即 2 月、4 月和 5 月 然后取平均值(3月第5周+2月第4周+4月第4周) 并取每个月的第 4 周的平均值,每个月分别有 5 周

复制代码


dates_seq<-(seq(as.Date("2020/02/01"), by = "day", length.out = 152))
dates_seq<-as.data.frame(dates_seq)
values<-seq(1:152)
df<-as.data.frame(cbind(dates_seq,values))

手动方法

temp <- subset(df, dates_seq >= as.Date('2020-02-01') & 
                 dates_seq <= as.Date('2020-06-30'))
temp$week_day <- weekdays(temp$dates_seq)
temp$week_number <- ave(temp$week_day, temp$week_day, format(temp$StartOfWeekDt, "%Y-%m"), FUN = seq_along)


week1<-subset(temp, (week_number == 1 & week_day == 'Tuesday' |
                     week_number == 5 & week_day == 'Tuesday' |
                     week_number == 10 & week_day == 'Tuesday'|
                     week_number == 14 & week_day == 'Tuesday'|
                     week_number == 18 & week_day == 'Tuesday') )
week1_avg=mean(week1$values);
week1

我试过这种方法,但这是一种非常手动的方法,当日期改变时,上述条件也会改变

下面提供了输出link

https://ibb.co/BcsC7Rt

我想这会让你得到结果。请注意,第 n 个值 "NA" 是您的 "Last Tuesdays"。看看测试好不好

    df %>%
  filter(wday(dates_seq) == 2) %>%
  mutate(Month = month(dates_seq)) %>%
  arrange(dates_seq) %>%
  group_by(Month) %>%
  mutate (nth = ifelse(Month < lead(Month, default = last(Month)), 99, 1:5)) %>%
  mutate (nth = ifelse((nth > lead(nth)), 99, nth)) %>%
  group_by(nth) %>%
  summarise(mean = mean(values))