Подсчитать количество дней от конкретной даты с идентификатором в качестве "переменной разрыва"

Я хотел бы посчитать количество дней от конкретной даты с переменной Id как "переменная прерывания" и поместите результат в новый столбец. Я хотел бы, чтобы результат был похож на тот, что в кадре данных RESULT,

Я собираю данные о прогрессе пациента (Variable_x) и я хочу использовать переменную "количество дней" в качестве переменной времени в смешанной модели.

Вот переменные:

Id <- c(1,1,1,1,2,2,2,5,5,5,5,5)
Date <- as.Date (c("2015-01-01", "2015-01-10", "2015-01-15","2015-01-25","2013-02-01", "2013-03-20", "2013-04-03","2014-05-06","2014-06-07","2014-06-08","2014-08-09","2014-10-10"))
Variable_x <- c("70","NA","55", "30", "70", "60", "NA", "80", "60", "70", "50","20")
Days <- c(0,9,14,24,0,47,61,0,32,33,95,157)

Вот данные, которые у меня есть:

DATA <- data.frame(Id, Date, Variable_x)

Вот данные, которые я хочу:

RESULT <- data.frame(Id, Date, Days, Variable_x)

Надеюсь, что кто-то может придумать ответ или указать мне правильное направление.

Помощь будет высоко ценится.

2 ответа

Решение

Возможность использования data.table, Мы конвертируем data.frame в data.tablesetDT(DATA)), сгруппированные по "Id", мы получаем разницу "Дата" и lag "Дата" (shift по умолчанию имеет type=lag), получить cumsum и назначить (:=) вывод для создания столбца "Дни".

library(data.table)#v1.9.6+
setDT(DATA)[, Days:=cumsum(as.numeric(Date-shift(Date, fill=Date[1L]))), Id]
DATA
#    Id       Date Variable_x Days
# 1:  1 2015-01-01         70    0
# 2:  1 2015-01-10         NA    9
# 3:  1 2015-01-15         55   14
# 4:  1 2015-01-25         30   24
# 5:  2 2013-02-01         70    0
# 6:  2 2013-03-20         60   47
# 7:  2 2013-04-03         NA   61
# 8:  5 2014-05-06         80    0
# 9:  5 2014-06-07         60   32
#10:  5 2014-06-08         70   33
#11:  5 2014-08-09         50   95
#12:  5 2014-10-10         20  157

Вы, вероятно, ищете diff combined with one of R's many grouping functions.

Here's an example with "dplyr":

library(dplyr)
DATA %>%
  group_by(Id) %>%
  mutate(Days = cumsum(c(0, diff(Date))))
# Source: local data frame [12 x 4]
# Groups: Id [3]
# 
#       Id       Date Variable_x  Days
#    (dbl)     (date)     (fctr) (dbl)
# 1      1 2015-01-01         70     0
# 2      1 2015-01-10         NA     9
# 3      1 2015-01-15         55    14
# 4      1 2015-01-25         30    24
# 5      2 2013-02-01         70     0
# 6      2 2013-03-20         60    47
# 7      2 2013-04-03         NA    61
# 8      5 2014-05-06         80     0
# 9      5 2014-06-07         60    32
# 10     5 2014-06-08         70    33
# 11     5 2014-08-09         50    95
# 12     5 2014-10-10         20   157
Другие вопросы по тегам