#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")