【问题标题】:Assigning Values in R by Date Range按日期范围在 R 中分配值
【发布时间】:2021-02-23 03:51:28
【问题描述】:

我正在尝试在我的每日观察数据集中创建一个“周”变量,每当新的星期一发生时,它就会以一个新值(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 日这几天归类为同一周。

有没有人能很好地解决这个问题?我很感激人们可能有任何见解。

【问题讨论】:

  • 如果您添加一些数据和相应的预期输出,有助于理解问题和您想要的行为。

标签: r lubridate as.date


【解决方案1】:

这样也可以

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

【讨论】:

  • 这解决了问题!非常感谢您的解决方案,我很感激。
【解决方案2】:

减去最小日期的日期,将差除以 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

【讨论】:

  • 这是解决问题的超级简单方法。非常感谢你帮我解决这个问题。
【解决方案3】:

也许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

【讨论】:

  • 这非常好用!非常感谢您的帮助。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2021-11-16
  • 2015-08-24
相关资源
最近更新 更多