Получить номера дней и недель из сгруппированных переменных

#r #date #data-cleaning #days #rep

#r #Дата #очистка данных #дни #повторение

Вопрос:

Было интересно, может ли кто-нибудь помочь мне с задачей очистки данных.

Я пытаюсь подсчитать 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!
  

Комментарии:

1. Как вы получаете 34-ю, 35-ю неделю в зависимости от указанной даты

2. Просто пример того, как я стремлюсь, чтобы это выглядело.

3. Я думал sample %>% mutate(date = as.Date(date)) %>% group_by(patient_id) %>% mutate(days = (row_number()-1) %% 7 1, week = week(date))

4. Идеальное решение для подсчета дней, спасибо, приятель.

Ответ №1:

Мы можем преобразовать ‘date’ в Date класс, сгруппированный по ‘patient_id’, создать ‘days’ с помощью row_number и извлечь 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))
  

Ответ №2:

Мы можем использовать 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   
  

Комментарии:

1. Спасибо за это. Нашел простое решение непосредственно перед отправкой: sample %>% group_by(patient_id) %>% mutate(seven_days = (row_number()-1) %% 7 1) %>% ungroup() %>% group_by(patient_id, seven_days) %>% mutate(weeks = row_number())