Как вычислить новую переменную на основе количества дней, прошедших с определенного типа записи

Я пытаюсь создать переменную, которая показывает количество дней, прошедших с того или иного события. Это продолжение предыдущего вопроса с использованием тех же данных.

Данные выглядят так (примечание даты в формате ДД-ММ-ГГГГ):

ID  date      drug  score
A   28/08/2016  2   3
A   29/08/2016  1   4
A   30/08/2016  2   4
A   2/09/2016   2   4
A   3/09/2016   1   4
A   4/09/2016   2   4
B   8/08/2016   1   3
B   9/08/2016   2   4
B   10/08/2016  2   3
B   11/08/2016  1   3
C   30/11/2016  2   4
C   2/12/2016   1   5
C   3/12/2016   2   1
C   5/12/2016   1   4
C   6/12/2016   2   4
C   8/12/2016   1   2
C   9/12/2016   1   2 

Для "наркотиков": 1= наркотики приняты, 2= наркотики не приняты.

Каждый раз, когда значение drug равно 1, если у этого идентификатора есть предыдущая запись, которая также равна drug==1, мне нужно сгенерировать новое значение lagtime, которое показывает количество дней (а не количество строк!) С тех пор, как предыдущий раз препарат принимался.

Итак, результат, который я ищу:

ID  date      drug  score  lagtime
A   28/08/2016  2   3
A   29/08/2016  1   4
A   30/08/2016  2   4
A   2/09/2016   2   4
A   3/09/2016   1   4      5
A   4/09/2016   2   4
B   8/08/2016   1   3
B   9/08/2016   2   4
B   10/08/2016  2   3
B   11/08/2016  1   3      3
C   30/11/2016  2   4
C   2/12/2016   1   5
C   3/12/2016   2   1
C   5/12/2016   1   4      3
C   6/12/2016   2   4
C   8/12/2016   1   2      3
C   9/12/2016   1   2      1

Поэтому мне нужен способ генерирования (видоизменения?) Этого показателя времени задержки, который рассчитывается как дата для каждой записи препарата == 1, за вычетом даты предыдущей записи препарата == 1, сгруппированной по идентификатору. Это меня совершенно запутало.

Вот код для примера данных:

data<-data.frame(ID=c("A","A","A","A","A","A","B","B","B","B","C","C","C","C","C","C","C"),
                 date=as.Date(c("28/08/2016","29/08/2016","30/08/2016","2/09/2016","3/09/2016","4/09/2016","8/08/2016","9/08/2016","10/08/2016","11/08/2016","30/11/2016","2/12/2016","3/12/2016","5/12/2016","6/12/2016","8/12/2016","9/12/2016"),format= "%d/%m/%Y"),
                 drug=c(2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,1,1),
                 score=c(3,4,4,4,4,4,3,4,3,3,4,5,1,4,4,2,2))

1 ответ

Решение

Мы можем использовать data.table, Преобразовать data.frame в data.tablesetDT(data)), сгруппированные по идентификатору, укажите i (drug ==1), получить разницу "дата" (diff(date)), объединить с NA как diff выходная длина на 1 меньше исходного вектора, преобразовать в integer и назначить (:=) создать "время задержки". По умолчанию все остальные значения будут NA

library(data.table)
setDT(data)[drug==1, lagtime := as.integer(c(NA, diff(date))), ID]
data
#    ID       date drug score lagtime
# 1:  A 2016-08-28    2     3      NA
# 2:  A 2016-08-29    1     4      NA
# 3:  A 2016-08-30    2     4      NA
# 4:  A 2016-09-02    2     4      NA
# 5:  A 2016-09-03    1     4       5
# 6:  A 2016-09-04    2     4      NA
# 7:  B 2016-08-08    1     3      NA
# 8:  B 2016-08-09    2     4      NA
# 9:  B 2016-08-10    2     3      NA
#10:  B 2016-08-11    1     3       3
#11:  C 2016-11-30    2     4      NA
#12:  C 2016-12-02    1     5      NA
#13:  C 2016-12-03    2     1      NA
#14:  C 2016-12-05    1     4       3
#15:  C 2016-12-06    2     4      NA
#16:  C 2016-12-08    1     2       3
#17:  C 2016-12-09    1     2       1
Другие вопросы по тегам