创建一个新的日期变量,该变量与 r 中的原始日期变量位于同一周的同一天、同一个月和同一年

Sar*_*ara 6 r date

我需要从日期变量“casedates”创建一个新变量“controldates”。这个新变量将由与 casedate 在同一周的同一天,在与 case date 相同的月份和年份内的日期组成。例如,如果我的案例日期是 7 月的第 3 个星期三,我的控制日将是 7 月的第一个星期三、7 月的第二个星期三和 7 月的第 4 个星期三。此外,我想为创建的每组日期创建一个指标变量。我想在 r 中使用 dplyr 来做到这一点。

起始数据:

Casedate
 "01-03-2015"
 "08-27-2017"
 "10-23-2019"
Run Code Online (Sandbox Code Playgroud)

这就是我想要的样子

Casedate          Controldate      Index
"01-03-2015"      "01-03-2015"       1
"01-03-2015"      "01-10-2015"       1
"01-03-2015"      "01-17-2015"       1
"01-03-2015"      "01-24-2015"       1
"01-03-2015"      "01-31-2015"       1
"08-12-2017"      "08-05-2017"       2
"08-12-2017"      "08-12-2017"       2
"08-12-2017"      "08-19-2017"       2
"08-12-2017"      "08-26-2017"       2
"10-23-2019"      "10-02-2019"       3
"10-23-2019"      "10-09-2019"       3
"10-23-2019"      "10-16-2019"       3
"10-23-2019"      "10-23-2019"       3
"10-23-2019"      "10-30-2019"       3
Run Code Online (Sandbox Code Playgroud)

akr*_*run 1

这是一个带有 的选项tidyverse。将 'Casedate' 转换为Datelubridate,然后使用 循环遍历元素,在a列中map创建seq日期的影响listunnestlist

library(dplyr)
library(purrr)
library(lubridate)
df1 %>% 
   mutate(Index = row_number(), 
      Casedate = mdy(Casedate), 
     wd = wday(Casedate, label = TRUE), 
     Controldate = map2(floor_date(Casedate, 'month'), wd, ~ {
   x1 <- seq(.x, length.out = 7, by = '1 day')
    seq(x1[wday(x1, label = TRUE) == .y],
       ceiling_date(.x, 'month'), by = '7 day')})) %>% 
    unnest(c(Controldate)) %>%
    select(Casedate, Controldate, Index)
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 14 x 3
#   Casedate   Controldate Index
#   <date>     <date>      <int>
# 1 2015-01-03 2015-01-03      1
# 2 2015-01-03 2015-01-10      1
# 3 2015-01-03 2015-01-17      1
# 4 2015-01-03 2015-01-24      1
# 5 2015-01-03 2015-01-31      1
# 6 2017-08-27 2017-08-06      2
# 7 2017-08-27 2017-08-13      2
# 8 2017-08-27 2017-08-20      2
# 9 2017-08-27 2017-08-27      2
#10 2019-10-23 2019-10-02      3
#11 2019-10-23 2019-10-09      3
#12 2019-10-23 2019-10-16      3
#13 2019-10-23 2019-10-23      3
#14 2019-10-23 2019-10-30      3
Run Code Online (Sandbox Code Playgroud)

数据

df1 <- structure(list(Casedate = c("01-03-2015", "08-27-2017", "10-23-2019"
)), class = "data.frame", row.names = c(NA, -3L))
Run Code Online (Sandbox Code Playgroud)