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

使用data.table按ID和DrugType分组逐行更新处方用药周期

R语言按分组计算患者用药周期解决方案

现有代码未按ID和DrugType分组,计算时会跨患者、跨药物类型取前一行数值,导致结果错误。使用data.table自带的分组运算即可实现需求,无需手动处理分组判断逻辑。

前置步骤:日期格式转换

首先需要将字符串格式的日期列转为R标准日期类型,避免日期运算出错:

library(data.table)

AllDrugs[, `:=`(
  StartPrescr = as.Date(StartPrescr, format = "%d-%m-%Y"),
  EndPrescr = as.Date(EndPrescr, format = "%d-%m-%Y")
)]

方法1:分组内循环(逻辑和原有实现一致,易理解)

将循环逻辑封装在data.table的分组表达式中,每个ID+DrugType的组合会独立运算,自动实现新分组的计算重置:

AllDrugs[, 
  EndPrescr := {
    current_end <- EndPrescr[1]
    res <- c(current_end)
    for (i in 2:.N) {
      if (StartPrescr[i] >= current_end) {
        current_end <- StartPrescr[i] + Duration[i]
      } else {
        current_end <- current_end + Duration[i]
      }
      res <- c(res, current_end)
    }
    as.Date(res, origin = "1970-01-01")
  },
  by = .(ID, DrugType)
]

方法2:向量化运算(效率更高,适合大数据量)

如果数据集行数较多,使用向量化运算的执行效率远高于循环:

AllDrugs[, 
  EndPrescr := {
    prev_end <- shift(EndPrescr, fill = as.Date("1900-01-01"))
    gap <- pmax(StartPrescr - prev_end, 0)
    as.Date(cumsum(Duration + gap) + StartPrescr[1] - Duration[1], origin = "1970-01-01")
  },
  by = .(ID, DrugType)
]

两种方法输出的结果和你期望的正确结果完全一致,支持任意多的DrugType和患者ID分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:09:03