如何根据变量的阈值拆分 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.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
我有记录入院日期和住院天数的住院数据:
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.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