如何使用一些定义的逻辑,根据特定的日期范围和它的值,找到每周二的星期。

问题描述 投票:0回答:1

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

每月第一周周二的平均值 每月第二周周二的平均值 每月第三周周二的平均值

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

如果这个月的3月和6月有第5个星期二,也就是最后一周,而其他月份的最后一周是4周,也就是2月、4月和5月,那么取平均值(3月第5周+2月第4周+4月第4周),并分别取有5周的每个月的第4周的平均值。

复写代码


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.coBcsC7Rt

r dplyr tidyverse tidyr lubridate
1个回答
1
投票

我想这样就可以得到结果了。注意,第n个值 "NA "是你的 "最后一个周二"。看看它是否测试良好。

    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))
© www.soinside.com 2019 - 2024. All rights reserved.