按日期范围在 R 中分配值

问题描述

我试图在我的日常观察数据集中创建一个“周”变量,每当新的星期一发生时,该变量以新值(1、2、3 等)开头。我的数据集有从 2020 年 4 月 6 日开始的观察,数据以“YYYY-MM-DD”as.date() 格式存储。在此示例中,4 月 6 日至 4 月 12 日之间的观察结果为“1”,4 月 13 日至 4 月 19 日之间的观察结果为“2”等。

我知道 lubridate 中的 week() 包,但不幸的是这对我的目的不起作用,因为一年中没有 54 周,因此“第 54 周”只有几天长。换句话说,我希望将 2020 年 12 月 28 日至 2021 年 1 月 3 日这几天归为同一周。

有没有人有很好的解决这个问题的方法?我很感激大家的任何见解。

解决方法

这也行

df <- data.frame(date = as.Date("2020-04-06")+ 0:365)

library(dplyr)
library(lubridate)

df %>% group_by(d= year(date),week = (isoweek(date))) %>%
  mutate(week = cur_group_id()) %>% ungroup() %>% select(-d)

# A tibble: 366 x 2
   date        week
   <date>     <int>
 1 2020-04-06     1
 2 2020-04-07     1
 3 2020-04-08     1
 4 2020-04-09     1
 5 2020-04-10     1
 6 2020-04-11     1
 7 2020-04-12     1
 8 2020-04-13     2
 9 2020-04-14     2
10 2020-04-15     2
# ... with 356 more rows
,

用最小日期减去日期,将差值除以 7,然后使用 floor 得到每 7 天的 1 个数字。

x <- as.Date(c('2020-04-06','2020-04-07','2020-04-13','2020-12-28','2021-01-03'))
as.integer(floor((x - min(x))/7) + 1)
#[1]  1  1  2 39 39
,

也许 lubridate::isoweek()lubridate::isoyear() 是您想要的?

一些数据:

df1 <- data.frame(date = seq.Date(as.Date("2020-04-06"),as.Date("2021-01-04"),by = "1 day"))

示例代码:

library(dplyr)
library(lubridate)

df1 <- df1 %>% 
  mutate(week = isoweek(date),year = isoyear(date)) %>% 
  group_by(year) %>% 
  mutate(week2 = 1 + (week - min(week))) %>% 
  ungroup()

head(df1,8)

# A tibble: 8 x 4
  date        week  year week2
  <date>     <dbl> <dbl> <dbl>
1 2020-04-06    15  2020     1
2 2020-04-07    15  2020     1
3 2020-04-08    15  2020     1
4 2020-04-09    15  2020     1
5 2020-04-10    15  2020     1
6 2020-04-11    15  2020     1
7 2020-04-12    15  2020     1
8 2020-04-13    16  2020     2

tail(df1,8)

# A tibble: 8 x 4
  date        week  year week2
  <date>     <dbl> <dbl> <dbl>
1 2020-12-28    53  2020    39
2 2020-12-29    53  2020    39
3 2020-12-30    53  2020    39
4 2020-12-31    53  2020    39
5 2021-01-01    53  2020    39
6 2021-01-02    53  2020    39
7 2021-01-03    53  2020    39
8 2021-01-04     1  2021     1