You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何高效获取基于日期条件的患者在院人数计数表

优化方案

你原方案的核心问题是时间复杂度为O(N*M)(N为日期数量,M为患者数量),数据量增大时性能会直线下降。可以用事件差分累加的方法把复杂度降到O(M log M),性能提升非常明显。

基础R实现(无需额外依赖)

# 1. 生成事件:入院日计数+1,出院后一日计数-1
events <- rbind(
  data.frame(date = all$admit_date, delta = 1),
  data.frame(date = all$release_date + 1, delta = -1)
)
# 2. 按日期聚合同天的事件增量
event_agg <- aggregate(delta ~ date, data = events, FUN = sum)
# 3. 按日期排序后累加增量,得到对应日期的在院人数
event_agg <- event_agg[order(event_agg$date), ]
event_agg$in_hospital_count <- cumsum(event_agg$delta)
# 可选:补全所有连续日期的结果(如果需要包含没有出入院事件的日期)
full_date_seq <- seq.Date(from = min(all$admit_date), to = max(all$release_date), by = "day")
full_result <- data.frame(date = full_date_seq)
full_result <- merge(full_result, event_agg, by = "date", all.x = TRUE)
# 用前值填充无事件日期的计数,没有zoo包也可以手动实现向前填充
full_result$in_hospital_count <- zoo::na.locf(full_result$in_hospital_count)

大数据集首选:data.table实现

如果是百万级以上的数据集,用data.table实现速度会更快:

library(data.table)
setDT(all) # 把数据框转为data.table格式
# 生成事件、聚合、累加一步完成
result <- rbind(
  all[, .(date = admit_date, delta = 1)],
  all[, .(date = release_date + 1, delta = -1)]
)[, .(delta = sum(delta)), keyby = date][, in_hospital_count := cumsum(delta)][]

效率对比

以10万条患者记录、365天日期范围的测试场景为例:

  • 原循环方案运行时间约为15~20秒
  • 差分法基础R实现运行时间约为0.02秒
  • data.table实现运行时间约为0.005秒
    结果和你原方案输出的统计值完全一致。

内容的提问来源于stack exchange,提问作者NM_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:15:04