Как вычислить новую переменную на основе количества дней, прошедших с определенного типа записи
Я пытаюсь создать переменную, которая показывает количество дней, прошедших с того или иного события. Это продолжение предыдущего вопроса с использованием тех же данных.
Данные выглядят так (примечание даты в формате ДД-ММ-ГГГГ):
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