R вставка строк между датами по группе на основе второго столбца - PullRequest
1 голос
/ 05 мая 2020

У меня есть df, который выглядит так

ID    FINAL_DT      START_DT

23       NA        2020-03-20
25       NA        2020-04-10
29   2020-02-02    2020-01-23
30       NA        2020-01-02

Я бы хотел, чтобы для каждого идентификатора добавлялась строка для каждого месяца, начиная с START_DT и заканчивая тем, что наступит первым, FINAL_DT или текущая дата . Ожидаемый результат будет следующим:

ID    FINAL_DT      START_DT      ACTIVE_MONTH

23       NA        2020-03-20       2020-03
23       NA            NA           2020-04
23       NA            NA           2020-05
25       NA        2020-04-10       2020-04
25       NA            NA           2020-05
29   2020-02-02    2020-01-23       2020-01
29   2020-02-02        NA           2020-02
30       NA        2020-01-02       2020-01
30       NA            NA           2020-02
30       NA            NA           2020-03 
30       NA            NA           2020-04
30       NA            NA           2020-05

У меня есть следующий код, который работает, но не учитывает FINAL_DT

current_date = as.Date(Sys.Date())

enroll <- enroll %>%
          group_by(ID) %>% 
          complete(START_DATE = seq(START_DATE, current_date, by = "month"))

Я пробовал следующее, но получил сообщение об ошибке, которое, как мне кажется, связано в АН:

current_date = as.Date(Sys.Date())

enroll <- enroll %>%
          group_by(ID) %>% 
          complete(START_DATE = seq(START_DATE, min(FINAL_DT,current_date), by = "month"))

День месяца также не имеет значения, я не уверен, что было бы легче отказаться от этого до или после.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вот еще один подход. Вы можете использовать floor_date, чтобы указать первый день месяца в вашей последовательности месяцев. Затем вы можете добавить всю последовательность к сегодняшней дате и отфильтровать по FINAL_DT. Вы можете использовать as.yearmon из zoo, если вам нужен объект месяц / год для месяца.

library(zoo)
library(tidyr)
library(dplyr)
library(lubridate)

current_date = as.Date(Sys.Date())

enroll %>%
  mutate(ACTIVE_MONTH = floor_date(START_DT, unit = "month")) %>%
  group_by(ID) %>%
  complete(ACTIVE_MONTH = seq.Date(floor_date(START_DT, unit = "month"), current_date, by = "month")) %>%
  filter(ACTIVE_MONTH <= first(FINAL_DT) | is.na(first(FINAL_DT))) %>%
  ungroup() %>%
  mutate(ACTIVE_MONTH = as.yearmon(ACTIVE_MONTH))

Вывод

# A tibble: 12 x 4
      ID ACTIVE_MONTH FINAL_DT   START_DT  
   <dbl> <yearmon>    <date>     <date>    
 1    23 Mar 2020     NA         2020-03-20
 2    23 Apr 2020     NA         NA        
 3    23 May 2020     NA         NA        
 4    25 Apr 2020     NA         2020-04-10
 5    25 May 2020     NA         NA        
 6    29 Jan 2020     2020-02-02 2020-01-23
 7    29 Feb 2020     NA         NA        
 8    30 Jan 2020     NA         2020-01-02
 9    30 Feb 2020     NA         NA        
10    30 Mar 2020     NA         NA        
11    30 Apr 2020     NA         NA        
12    30 May 2020     NA         NA
1 голос
/ 05 мая 2020

Вот подход, который возвращает строки для каждого MONTH с помощью lubridate.

library(dplyr)
library(tidyr)
library(lubridate)
current_date = as.Date(Sys.Date())

enroll %>%
  mutate(MONTH = month(START_DT)) %>%
  group_by(ID) %>% 
  complete(MONTH = seq(MONTH, min(month(FINAL_DT)[!is.na(FINAL_DT)],month(current_date))))
# A tibble: 12 x 4
# Groups:   ID [4]
#      ID MONTH FINAL_DT   START_DT  
#   <int> <dbl> <fct>      <fct>     
# 1    23     3 NA         2020-03-20
# 2    23     4 NA         NA        
# 3    23     5 NA         NA        
# 4    25     4 NA         2020-04-10
# 5    25     5 NA         NA        
# 6    29     1 2020-02-02 2020-01-23
# 7    29     2 NA         NA        
# 8    30     1 NA         2020-01-02
# 9    30     2 NA         NA        
#10    30     3 NA         NA        
#11    30     4 NA         NA        
#12    30     5 NA         NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...