【问题标题】:How to calculate week number based on consecutive weeks spanning four years如何根据跨越四年的连续周计算周数
【发布时间】:2021-06-13 09:54:11
【问题描述】:

假设我有一组日期存储在df$diag

> df
        diag
1 2017-01-02
2 2017-01-02
3 2017-01-05
4 2017-01-06
5 2017-01-09
6 2017-01-18

我想创建一个新的协变量 df$week,它从星期一开始计算连续周数 2017-01-02,如 yyyy-mm-dd,其中 2017-01-02 对应于 df$week==1。对于在2017-01-022020-12-31 之间经过的每个星期一,df$week 应该增加 1。

> df
        diag  week
1 2017-01-02     1
2 2017-01-02     1
3 2017-01-05     1
4 2017-01-06     1
5 2017-01-09     2
6 2017-01-18     3

我试过了

mutate(df, week = 1 + round(as.numeric(difftime(strptime(diag, format = "%Y-%m-%d"),
                                                strptime("02.01.2017", format = "%d.%m.%Y"),
                                                units="weeks"), digits = 0)))

这给了

        diag week
1 2017-01-02    1
2 2017-01-02    1
3 2017-01-05    1
4 2017-01-06    2
5 2017-01-09    2
6 2017-01-18    3

但是,星期五2017-01-06 应该正确属于df$week==1,而星期一2017-01-09 应该继续属于df$week==2

我正在dplyr寻找解决方案。

数据

df <- structure(list(diag = c("2017-01-02", "2017-01-02", "2017-01-05", 
"2017-01-06", "2017-01-09", "2017-01-18")), class = "data.frame", row.names = c(NA, 
-6L))

【问题讨论】:

    标签: r dataframe time dplyr lubridate


    【解决方案1】:

    这个怎么样(假设诊断的第一天是星期一

    df %>% mutate(diag = as.Date(diag),
                  weekno = as.numeric(diag - first(diag)),
                  weekno = (weekno %/% 7) +1)
            diag weekno
    1 2017-01-02      1
    2 2017-01-02      1
    3 2017-01-05      1
    4 2017-01-06      1
    5 2017-01-09      2
    6 2017-01-18      3
    

    【讨论】:

      【解决方案2】:

      这是一种使用dplyr::mutatebaseR 的方法

      library(dplyr)
      df %>%
        mutate(
          day_since_2017_01_02 = as.integer(difftime(diag, as.Date("2017-01-02"),
            units = "days")),
          week_index = (day_since_2017_01_02 + 1) %/% 7 + 1
        )
      

      输出

              diag day_since_2017_01_02 week_index
      1 2017-01-02                    0          1
      2 2017-01-02                    0          1
      3 2017-01-05                    2          1
      4 2017-01-06                    3          1
      5 2017-01-09                    6          2
      6 2017-01-18                   15          3
      

      【讨论】:

      • 谢谢! - 必须省略来自 week_index = (day_since_2017_01_02 + 1)+1 以获得所需的输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      相关资源
      最近更新 更多