1

我有记录入院日期和住院天数的住院数据:

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 这样的病例,他们在医院的住院时间超过了年底,而 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,因此特别欢迎使用该软件包的解决方案,但如果需要,我愿意尝试任何其他工具。

4

1 回答 1

1

我的解决方案并不紧凑。但是,我尝试雇用dplyr并做了以下事情。为了自己的理解,我最初更改了列名。ndays我通过添加来计算另一个日期(即 date.2)date.1。如果年份date.1date.2匹配,则意味着您不必考虑下一年。如果年份不匹配,则需要考虑下一年。ndays.2基本上是下一年的ndays。然后,我使用do. 用 NA 过滤不必要的行后,我更改date为andyear聚合数据。IDyear

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
于 2015-03-18T16:01:21.003 回答