从分组变量中获取日数和周数

Get day and week numbers from grouped variables

想知道是否有人可以帮助我完成数据整理任务。

我正在尝试计算数据集中的 7 天时间段,并将每个时间段标记为每个分组的周数 (1-n)。

到目前为止,我最好的尝试是在数据集上重复一系列 1:7,但它不考虑分组更改。我想要的输出是这样的:

site    patient_id    date    time    nebs_day    days
01    R01002     2019-04-04       NA        0     1
01    R01002     2019-04-05 16:57:14        1     2
01    R01002     2019-04-06       NA        0     3
01    R01002     2019-04-07 18:19:49        1     4
01    R01002     2019-04-08       NA        0     5
01    R01002     2019-04-09 15:06:44        1     6
01    R01002     2019-04-10 15:36:47        1     7
01    R01002     2019-04-11       NA        0     1
01    R01002     2019-04-12 17:42:32        1     2
01    R01002     2019-04-13 20:24:46        1     3 
01    R01003     2018-09-06 17:58:41        1     1 # Changes group with patient_id
01    R01003     2018-09-07 00:00:05        3     2
01    R01003     2018-09-08 12:52:57        1     3
01    R01003     2018-09-09 00:31:59        4     4
01    R01003     2018-09-10 12:36:52        2     5
01    R01003     2018-09-11 09:39:30        2     6
01    R01003     2018-09-12 09:38:22        3     7

对于周数,我正在尝试根据看起来像这样的天获得输出:

site    patient_id    date    time    nebs_day    days  week
01    R01002     2019-04-04       NA        0     1    34 #Increases by one for each period
01    R01002     2019-04-05 16:57:14        1     2    34
01    R01002     2019-04-06       NA        0     3    34
01    R01002     2019-04-07 18:19:49        1     4    34
01    R01002     2019-04-08       NA        0     5    34
01    R01002     2019-04-09 15:06:44        1     6    34
01    R01002     2019-04-10 15:36:47        1     7    34 
01    R01002     2019-04-11       NA        0     1    35 
01    R01002     2019-04-12 17:42:32        1     2    35
01    R01002     2019-04-13 20:24:46        1     3    35 #Not a full 7days, but mark as 1 week
01    R01003     2018-09-06 17:58:41        1     1    1  #Count resets with new patient_id
01    R01003     2018-09-07 00:00:05        3     2    1
01    R01003     2018-09-08 12:52:57        1     3    1
01    R01003     2018-09-09 00:31:59        4     4    1
01    R01003     2018-09-10 12:36:52        2     5    1
01    R01003     2018-09-11 09:39:30        2     6    1
01    R01003     2018-09-12 09:38:22        3     7    1

如有任何帮助,我们将不胜感激。在此之前我已经尝试过使用 days() 和 weeks(),但是在我的数据集中需要区分 7 天的时间段,因此使用 lubridate 不会完全准确。

下面是一些示例数据:

sample <- data.frame(
site = rep(1, each = 17), 
patient_id = c("R01002", "R01002", "R01002", "R01002", "R01002", "R01002", 
"R01002", "R01002", "R01002", "R01002", "R01003", "R01003", "R01003",
"R01003", "R01003", "R01003", "R01003"), 
date = c("2019-04-04", "2019-04-05","2019-04-06", "2019-04-07", "2019-04-08", "2019-04-09", "2019-04-10","2019-04-11", "2019-04-12", "2019-04-13", 
"2018-09-06", "2018-09-07", "2018-09-08", "2018-09-09", "2018-09-10", 
"2018-09-11", "2018-09-12"), 
nebs_day = c(0,1,0,1,0,1,1,0,1,1,1,3,1,4,2,2,3))

Thanks!

我们可以将 'date' 转换为 Date class,按 'patient_id' 分组,用 row_number 创建 'days' 并提取week 来自 'date'

library(dplyr)
library(lubridate)
sample %>% 
     mutate(date = as.Date(date)) %>%
     group_by(patient_id) %>% 
     mutate(days = (row_number()-1) %% 7 + 1, week = week(date))

我们可以使用 rep 来重复每个组中行数的值 1:7。要获得周数,我们可以使用 format.

library(dplyr)

sample %>%
  mutate(date = as.Date(date)) %>%
  group_by(site, patient_id) %>%
  mutate(days = rep(1:7, length.out = n()), 
         week = format(date, '%V'))

#    site patient_id date       nebs_day  days week 
#   <dbl> <chr>      <date>        <dbl> <int> <chr>
# 1     1 R01002     2019-04-04        0     1 14   
# 2     1 R01002     2019-04-05        1     2 14   
# 3     1 R01002     2019-04-06        0     3 14   
# 4     1 R01002     2019-04-07        1     4 14   
# 5     1 R01002     2019-04-08        0     5 15   
# 6     1 R01002     2019-04-09        1     6 15   
# 7     1 R01002     2019-04-10        1     7 15   
# 8     1 R01002     2019-04-11        0     1 15   
# 9     1 R01002     2019-04-12        1     2 15   
#10     1 R01002     2019-04-13        1     3 15   
#11     1 R01003     2018-09-06        1     1 36   
#12     1 R01003     2018-09-07        3     2 36   
#13     1 R01003     2018-09-08        1     3 36   
#14     1 R01003     2018-09-09        4     4 36   
#15     1 R01003     2018-09-10        2     5 37   
#16     1 R01003     2018-09-11        2     6 37   
#17     1 R01003     2018-09-12        3     7 37