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

Я хотел бы подсчитать количество дней с определенной даты с помощью переменной 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)

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

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


person Carl    schedule 26.09.2015    source источник


Ответы (2)


Вариант с использованием data.table. Мы преобразуем «data.frame» в «data.table» (setDT(DATA)), сгруппированные по «Id», мы получаем разницу «Date» и lag «Date» (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
person akrun    schedule 26.09.2015

Вероятно, вы ищете diff в сочетании с одной из многих функций группировки R.

Вот пример с "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
person A5C1D2H2I1M1N2O1R2T1    schedule 26.09.2015