Как разделить запись данных панели в R на основе порогового значения для переменной?

У меня есть данные о госпитализации, в которых записана дата поступления и количество дней, проведенных в больнице:

ID    date        ndays
1     2005-06-01   15
2     2005-06-15   60
3     2005-12-25   20
4     2005-01-01   400
4     2006-06-04   15

Я хотел бы создать набор данных о днях, проведенных в больнице в год, и поэтому мне нужно иметь дело с такими случаями, как ID 3, чье пребывание в больнице длится в конце года, и ID 4, чье пребывание в больнице составляет более одного года. Существует также проблема, что у некоторых людей есть запись на следующий год, и я хотел бы добавить «лишние» дни к тем, когда это происходит.

До сих пор я придумал это решение:

library(lubridate)
ndays_new <- ifelse((as.Date(paste(year(data$date),"12-31",sep="-")),
                                   format="%Y-%m-%d") - data$date) < data$ndays,
                    (as.Date(paste(year(data$date),"12-31",sep="-")),
                                   format="%Y-%m-%d") - data$date) ,
                    data$ndays)

Тем не менее, я не могу придумать способ получить эти «лишние» дни, которые проходят в конце года, и присвоить их новой записи, начиная со следующего года. Может ли кто-нибудь указать мне хорошее решение? Я использую dplyr, поэтому решения с этим пакетом будут особенно приветствоваться, но я готов попробовать любой другой инструмент, если это необходимо.


person Kenji    schedule 18.03.2015    source источник


Ответы (1)


Мое решение не компактно. Но я попытался использовать dplyr и сделал следующее. Сначала я изменил имена столбцов для собственного понимания. Я рассчитал другую дату (т. е. date.2), добавив ndays к date.1. Если годы date.1 и date.2 совпадают, это означает, что вам не нужно учитывать следующий год. Если годы не совпадают, нужно считать следующий год. ndays.2 в основном ndays на следующий год. Затем я изменил данные, используя do. После фильтрации ненужных строк с помощью NA я изменил date на year и агрегировал данные по ID и year.

rename(mydf, date.1 = date, ndays.1 = ndays) %>%
mutate(date.1 = as.POSIXct(date.1, format = "%Y-%m-%d"),
       date.2 = date.1 + (60 * 60 * 24) * ndays.1,
       ndays.2 = ifelse(as.character(format(date.1, "%Y")) == as.character(format(date.2, "%Y")), NA,
                        date.2 - as.POSIXct(paste0(as.character(format(date.2, "%Y")),"-01-01"), format = "%Y-%m-%d")),
       ndays.1 = ifelse(ndays.2 %in% NA, ndays.1, ndays.1 - ndays.2)) %>%
do(data.frame(ID = .$ID, date = c(.$date.1, .$date.2), ndays = c(.$ndays.1, .$ndays.2))) %>%
filter(complete.cases(ndays)) %>%
mutate(date = as.numeric(format(date, "%Y"))) %>%
rename(year = date) %>%
group_by(ID, year) %>%
summarise(ndays = sum(ndays))

#  ID year ndays
#1  1 2005    15
#2  2 2005    60
#3  3 2005     7
#4  3 2006    13
#5  4 2005   365
#6  4 2006    50
person jazzurro    schedule 18.03.2015