在R语言中按日期分组统计每日住院床位使用量的高效方法
简便实现每日床位使用数统计的方法
你可以借助tidyverse系列工具包(结合lubridate处理日期)或者data.table来高效完成这个转换,完全不需要手动写循环。以下是两种常用方案:
方案一:使用tidyverse + lubridate
这个方案代码可读性强,适合常规规模的数据:
library(tidyverse) library(lubridate) # 先转换日期格式并计算出院日期(住院天数包含起始日,所以出院日=起始日+住院天数-1) my_df_processed <- my_df %>% mutate( StartDate = ymd(StartDate), EndDate = StartDate + days(BedDays - 1) ) # 生成每个患者的住院日期序列,再按日期统计床位使用数 daily_bed_usage <- my_df_processed %>% rowwise() %>% # 为每个患者生成从入院到出院的日期列表 mutate(daily_dates = list(seq(StartDate, EndDate, by = "day"))) %>% # 展开日期列表为单行单日期格式 unnest(daily_dates) %>% # 按日期分组,统计当日在院人数(即床位使用数) group_by(daily_dates) %>% summarise(bed_count = n(), .groups = "drop") %>% rename(Date = daily_dates) # 查看结果 print(daily_bed_usage)
方案二:使用data.table
如果你的数据集规模较大,data.table的处理效率会更高:
library(data.table) library(lubridate) # 转换为data.table格式并处理日期 setDT(my_df) my_df[, `:=`( StartDate = ymd(StartDate), EndDate = StartDate + days(BedDays - 1) )] # 生成日期序列并统计 daily_bed_usage <- my_df[, .(Date = seq(StartDate, EndDate, by = "day")), by = RecordID] %>% .[, .(bed_count = .N), by = Date] # 查看结果 print(daily_bed_usage)
两种方案的核心逻辑一致:先为每位患者生成完整的住院日期序列,再按日期分组计数,得到当日的床位使用数量,全程无需手动编写循环逻辑。
内容的提问来源于stack exchange,提问作者Shan Cheung
相关产品推荐
相关产品推荐

