如何根据变量的阈值拆分 R 中的面板数据记录?

How to split a panel data record in R based on a threshold value for a variable?

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

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,因此特别欢迎使用该软件包的解决方案,但如果需要,我愿意尝试任何其他工具。

我的解决方案不紧凑。但是,我尝试使用 dplyr 并执行了以下操作。我最初为了自己的理解更改了列名。我通过将 ndays 添加到 date.1 来计算另一个日期(即 date.2)。如果 date.1date.2 的年份匹配,则意味着您不必考虑下一年。如果年份不匹配,则需要考虑下一年。 ndays.2 基本上是下一年的 ndays。然后,我使用 do 重塑了数据。在用 NA 过滤不需要的行后,我将 date 更改为 year 并按 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