Создайте переменную, которая принимает значение другой переменной в последовательности

#r #dplyr #sequence

Вопрос:

У меня есть набор данных, подобный приведенному ниже примеру. Я хочу создать переменную (т. Е. Submission_date.last), которая принимает последнее значение другой переменной (т. Е. Submission_date) на основе последовательности другой переменной (т. Е. повтора), в которой 0 указывает начало новой последовательности.

У меня есть приведенный ниже код, но я не знаю, куда идти дальше. Любая помощь приветствуется, спасибо!

 df %>%
  group_by(ID) %>%
  arrange(Submission_date) %>%
  mutate(Submission_date.last = Submission_date[]) # I'm not sure what to put on this line to correctly create the variable?

ID    Submission_date    Repeat    Submission_date.last
1        25/07/19          0          31/07/19
1        30/07/19          1          31/07/19
1        31/07/19          2          31/07/19
1        11/08/20          0          14/08/20
1        14/08/20          1          14/08/20
2        30/07/19          0          30/07/19
2        31/08/20          0          31/08/20
3        13/09/20          0          15/09/20
3        15/09/20          1          15/09/20
3        18/07/21          0          22/07/21
3        21/07/21          1          22/07/21
3        22/07/21          2          22/07/21
 

Ответ №1:

Создайте группу всякий Repeat = 0 раз, когда и для каждой группы получите last Submission_date .

 library(dplyr)

df %>%
  group_by(ID, grp = cumsum(Repeat == 0)) %>%
  mutate(Submission_date.last = last(Submission_date)) %>%
  ungroup %>%
  select(-grp)

#      ID Submission_date Repeat Submission_date.last
#   <int> <chr>            <int> <chr>               
# 1     1 25/07/19             0 31/07/19            
# 2     1 30/07/19             1 31/07/19            
# 3     1 31/07/19             2 31/07/19            
# 4     1 11/08/20             0 14/08/20            
# 5     1 14/08/20             1 14/08/20            
# 6     2 30/07/19             0 30/07/19            
# 7     2 31/08/20             0 31/08/20            
# 8     3 13/09/20             0 15/09/20            
# 9     3 15/09/20             1 15/09/20            
#10     3 18/07/21             0 22/07/21            
#11     3 21/07/21             1 22/07/21            
#12     3 22/07/21             2 22/07/21            
 

данные

Легче помочь, если вы предоставляете данные в воспроизводимом формате.

 df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L), Submission_date = c("25/07/19", "30/07/19", "31/07/19", 
"11/08/20", "14/08/20", "30/07/19", "31/08/20", "13/09/20", "15/09/20", 
"18/07/21", "21/07/21", "22/07/21"), Repeat = c(0L, 1L, 2L, 0L, 
1L, 0L, 0L, 0L, 1L, 0L, 1L, 2L)), row.names = c(NA, -12L), class = "data.frame")
 

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

1. Большое спасибо! Также будет включать данные в воспроизводимом формате в будущих вопросах, спасибо, что указали на это.

Ответ №2:

Мы можем использовать

 library(data.table)
setDT(df)[, Submission_date.last := last(Submission_date), 
     by = .(ID, cumsum(Repeat == 0))]
 

-уптут

 > df
    ID Submission_date Repeat Submission_date.last
 1:  1        25/07/19      0             31/07/19
 2:  1        30/07/19      1             31/07/19
 3:  1        31/07/19      2             31/07/19
 4:  1        11/08/20      0             14/08/20
 5:  1        14/08/20      1             14/08/20
 6:  2        30/07/19      0             30/07/19
 7:  2        31/08/20      0             31/08/20
 8:  3        13/09/20      0             15/09/20
 9:  3        15/09/20      1             15/09/20
10:  3        18/07/21      0             22/07/21
11:  3        21/07/21      1             22/07/21
12:  3        22/07/21      2             22/07/21
 

данные

 df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L), Submission_date = c("25/07/19", "30/07/19", "31/07/19", 
"11/08/20", "14/08/20", "30/07/19", "31/08/20", "13/09/20", "15/09/20", 
"18/07/21", "21/07/21", "22/07/21"), Repeat = c(0L, 1L, 2L, 0L, 
1L, 0L, 0L, 0L, 1L, 0L, 1L, 2L)), row.names = c(NA, -12L), class = "data.frame")