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