添加与具有不常见日期的日期列对齐的周计数序列

Add sequence of week count aligned to a date column with infrequent dates

我正在构建一个数据集,并希望能够从第一个日期开始到最后一个日期向数据集添加周数。我用它来总结一个更大的数据集,我想最终按周总结。

使用此示例:

library(dplyr)

df <- tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"), 
Week = nrow/7)
# A tibble: 93 x 2
   Date        Week
   <date>     <dbl>
 1 1944-06-01 0.143
 2 1944-06-02 0.286
 3 1944-06-03 0.429
 4 1944-06-04 0.571
 5 1944-06-05 0.714
 6 1944-06-06 0.857
 7 1944-06-07 1    
 8 1944-06-08 1.14 
 9 1944-06-09 1.29 
10 1944-06-10 1.43 
# … with 83 more rows

这绝对是不对的。另外,我的真实数据集不是按顺序构建的,周与周之间缺少很多天,因此直接按顺序计数是行不通的。

理想的最终结果是一个额外的 "week" 列,基于实际日期(而不是硬编码为 seq_along() 结果类型)

您可以用第一个 Date 减去所有 Date 值,然后使用 "weeks" 中的 difftime 计算差值,floor 所有值和加 1 从 1 开始计数。

df$week <- floor(as.numeric(difftime(df$Date, df$Date[1], units = "weeks"))) + 1


df
# A tibble: 93 x 2
#   Date        week
#   <date>     <dbl>
# 1 1944-06-01     1
# 2 1944-06-02     1
# 3 1944-06-03     1
# 4 1944-06-04     1
# 5 1944-06-05     1
# 6 1944-06-06     1
# 7 1944-06-07     1
# 8 1944-06-08     2
# 9 1944-06-09     2
#10 1944-06-10     2
# … with 83 more rows

要在您的 dplyr 管道中使用它,您可以这样做

library(dplyr)
df %>%
 mutate(week = floor(as.numeric(difftime(Date, first(Date), units = "weeks"))) + 1)

数据

df <- tibble::tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"))

与 Ronak 类似的解决方案,但 lubridate:

library(lubridate)

(df <- tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"),
              week = interval(min(Date), Date) %>%
                as.duration() %>%
                as.numeric("weeks") %>%
                floor() + 1))