使用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
相关产品推荐
相关产品推荐

