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

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

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

对于星期二第4周和星期二第5周,逻辑必须这样 如果该月只有4个星期二,则以“最后一周”为准;但是,如果该月有5个星期 然后需要遵循以下逻辑

如果该月的5月2日是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

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

输出在下面的链接中提供

https://ibb.co/BcsC7Rt

评论
  • verror
    verror 回复

    我认为这可以为您带来结果。请注意,DayOfWeek 99是您的“最后一个星期二”。看看测试是否良好。

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