Определить дату до события по идентификатору - PullRequest
1 голос
/ 30 апреля 2020

У меня есть набор данных, в котором я хочу определить, было ли отправлено приглашение (Событие = 0) перед событием (Событие = 1) по идентификатору. Приглашение считается отправленным, если оно пришло в тот же день, или приглашение (дата) не позднее, чем за 14 недель до мероприятия. Когда происходит событие, этот процесс сбрасывается.

Вот пример моего фрейма данных:

   ID       Date Event
1   1 2017-01-01     0
2   1 2017-01-02     0
3   1 2017-01-03     0
4   1 2017-01-04     1
5   4 2017-01-03     1
6   4 2017-01-03     0
7   4 2017-01-06     1
8   4 2017-01-04     0
9   4 2017-01-05     0
10  5 2017-02-01     0
11  5 2018-01-02     1
12  7 2018-01-03     1

Вот результат, который мне бы хотелось:

   ID       Date Event Sent
1   1 2017-01-01     0    0
2   1 2017-01-02     0    0
3   1 2017-01-03     0    0
4   1 2017-01-04     1    1
5   4 2017-01-03     1    1
6   4 2017-01-03     0    0
7   4 2017-01-06     1    1
8   4 2017-01-04     0    0
9   4 2017-01-05     0    0
10  5 2017-02-01     0    0
11  5 2018-01-02     1    0
12  7 2018-01-03     1    0

Исходный фрейм данных:

df <- data.frame(ID = c(rep("1", 4), rep("4", 5), c("5", "5"), "7"), Date = c(seq(as.Date('2017-01-01'), as.Date('2017-01-4'), by = 'days'), c(as.Date('2017-01-3'), as.Date('2017-01-3')), as.Date('2017-01-06'), as.Date('2017-01-4'), as.Date('2017-01-5'), c(as.Date("2017-02-01"), as.Date('2018-01-02'), as.Date('2018-01-03'))), Event = c(0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1))

Фрейм данных результата:

result_df <-  data.frame(ID = c(rep("1", 4), rep("4", 5), c("5", "5"), "7"), Date = c(seq(as.Date('2017-01-01'), as.Date('2017-01-4'), by = 'days'), c(as.Date('2017-01-3'), as.Date('2017-01-3')), as.Date('2017-01-06'), as.Date('2017-01-4'), as.Date('2017-01-5'), c(as.Date("2017-02-01"), as.Date('2018-01-02'), as.Date('2018-01-03'))), Event = c(0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1), Sent = c(0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0))

1 Ответ

2 голосов
/ 30 апреля 2020

Опция, использующая data.table:

library(data.table)
setDT(df)[, c("weeks7ago", "Sent") := .(Date - 14 * 7, 0L)]
df[Event==1L, Sent := 
    df[Event==0L][.SD, on=.(ID, Date>=weeks7ago), by=.EACHI, .N>0L]$V1]

output:

    ID       Date Event  weeks7ago Sent
 1:  1 2017-01-01     0 2016-09-25    0
 2:  1 2017-01-02     0 2016-09-26    0
 3:  1 2017-01-03     0 2016-09-27    0
 4:  1 2017-01-04     1 2016-09-28    1
 5:  4 2017-01-03     1 2016-09-27    1
 6:  4 2017-01-03     0 2016-09-27    0
 7:  4 2017-01-06     1 2016-09-30    1
 8:  4 2017-01-04     0 2016-09-28    0
 9:  4 2017-01-05     0 2016-09-29    0
10:  5 2017-02-01     0 2016-10-26    0
11:  5 2018-01-02     1 2017-09-26    0
12:  7 2018-01-03     1 2017-09-27    0

Большое спасибо за публикацию кода для создания данных, чтобы сэкономить нам время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...