如何按组计算处方data.frame的续药剩余剂量并识别停药
问题描述
现有一个存储同一药物处方信息的data.frame,包含字段:
idnr:患者唯一标识daily_doses:每日剂量filldate:处方日期
每一行对应一次处方,数据已按idnr和filldate排序,每个患者对应多条处方记录。
目标
- 生成变量
doses_left_at_time_of_subsequent_refill,表示下次续药时的剩余剂量(无后续续药时该值为-Inf) - 识别治疗中断:定义为后续续药时剩余剂量小于-30,中断日期通过公式
filldate + daily_doses + lag(doses_left_at_time_of_subsequent_refill)计算,患者可能存在多个中断日期
计算规则
- 提前续药(续药日期早于当前剂量覆盖天数):假设当前剂量在下次用药前已用完,按规则计算剩余剂量
- 延迟续药(续药日期晚于当前剂量覆盖天数):直接计算剩余剂量,不做调整
示例数据
原始数据预览
idnr daily_doses filldate 1. 10 2000-01-01 1. 10 2000-01-12 1. 10 2000-01-15 1. 10 2000-01-20 1. 10 2002-03-21 1. 10 2002-03-30 1. 10 2002-04-20 2. 10 2004-05-01 2. 20 2004-05-11 2. 10 2004-05-24 2. 10 2004-06-01 3. 20 2000-01-01 3. 10 2010-03-04 3. 10 2010-03-04 3. 10 2010-03-04 3. 10 2010-03-08 3. 10 2012-07-08 3. 10 2012-07-18 3. 10 2012-07-30 3. 10 2012-08-15 3. 10 2012-09-25
可直接运行的data.frame代码
data.frame( idnr = c(1L,1L,1L,1L,1L,1L,1L,2L,2L,2L, 2L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L), daily_doses = c(10L,10L,10L,10L,10L,10L,10L,10L, 20L,10L,10L,20L,10L,10L,10L,10L,10L,10L,10L,10L,10L), filldate = as.Date(c("2000-01-01","2000-01-12","2000-01-15", "2000-01-20","2002-03-21","2002-03-30","2002-04-20", "2004-05-01","2004-05-11","2004-05-24","2004-06-01", "2000-01-01","2010-03-04","2010-03-04","2010-03-04","2010-03-08", "2012-07-08","2012-07-18","2012-07-30","2012-08-15", "2012-09-25"), format = "%Y-%m-%d") )
期望输出
idnr daily_doses filldate doses_left_at_time_of_subsequent_refill 1. 10 2000-01-01 -1 1. 10 2000-01-12 7 1. 10 2000-01-15 12 1. 10 2000-01-20 -769 1. 10 2002-03-21 1 1. 10 2002-03-30 10 1. 10 2002-04-20 -Inf 2. 10 2004-05-01 0 2. 20 2004-05-11 7 2. 10 2004-05-24 11 2. 10 2004-06-01 -Inf 3. 20 2000-01-01 -3715 3. 10 2010-03-04 10 3. 10 2010-03-04 20 3. 10 2010-03-04 26 3. 10 2010-03-08 -817 3. 10 2012-07-08 0 3. 10 2012-07-18 -2 3. 10 2012-07-30 -6 3. 10 2012-08-15 -31 3. 10 2012-09-25 -Inf
已尝试方法及问题
- 使用
lag()函数偏移filldate:仅能处理每组前一行,处方多的患者处理效率低 - 使用
cumsum()函数:会出现已中断治疗周期的剂量累积问题,而这些剂量不应计入新周期
内容的提问来源于stack exchange,提问作者ccalle
相关产品推荐
相关产品推荐

