如何用data.table实现处方日期重叠的修正处理函数?
处理处方日期重叠的data.table分组修正函数
原始数据集
我们有一个已按id、start_ins、rxdate排序的data.table,其中rx_end由rxdate + amount计算而来,但存在处方日期重叠的情况(比如id=2的第二行rx_end晚于第三行rxdate):
library(data.table) dt <- data.table( id = c(1, 2, 2, 3, 3, 3), start_ins = as.Date(c("2000-10-12", "2000-03-31", "2000-03-31", "2000-01-11", "2000-01-11", "2000-01-11")), rxdate = as.Date(c("2010-01-04", "2010-03-30", "2010-04-08", "2003-12-29", "2004-01-12", "2004-03-10")), amount = c(30, 28, 100, 60, 1, 10), rx_end = as.Date(c("2010-02-03", "2010-04-27", "2010-07-17", "2004-02-27", "2004-01-13", "2004-03-20")) )
需求说明
按id和start_ins分组处理:
- 若当前行
rxdate早于前一行rx_end,则将当前行rxdate设为前一行rx_end + 1,并更新rx_end为新rxdate + amount - 无重叠则保持原数据
- 单条记录的分组不做任何处理
原尝试代码的问题
你之前写的函数存在两个核心问题:
- 在data.table的分组
j表达式里直接修改外部的dt,不符合data.table的操作规范,容易引发意外修改 - 循环中对
prev_end_date的索引处理逻辑有误,没有正确维护每一步更新后的前一行结束日期
正确实现函数
下面是符合需求的修正函数,核心是在每个分组内部逐行迭代,维护更新后的前一行结束日期:
overlapper <- function(dt) { # 确保数据集已按要求排序(如果外部未提前排序,内部补做) setorder(dt, id, start_ins, rxdate) dt[, { # 复制当前分组的局部数据,避免直接修改原表 group_dt <- .SD if (.N == 1) { # 单条记录直接返回,无需处理 return(group_dt) } # 初始化前一行的结束日期为分组第一行的rx_end prev_end <- group_dt$rx_end[1] # 从第二行开始逐行检查处理 for (i in 2:.N) { current_rxdate <- group_dt$rxdate[i] if (current_rxdate <= prev_end) { # 存在重叠时,更新当前行的rxdate和rx_end group_dt$rxdate[i] <- prev_end + 1 group_dt$rx_end[i] <- group_dt$rxdate[i] + group_dt$amount[i] } # 更新前一行结束日期为当前行的rx_end(无论是否修改) prev_end <- group_dt$rx_end[i] } group_dt }, by = .(id, start_ins)] }
运行结果
调用函数后得到修正后的数据集:
corrected_dt <- overlapper(dt) print(corrected_dt) # id start_ins rxdate amount rx_end # 1: 1 2000-10-12 2010-01-04 30 2010-02-03 # 2: 2 2000-03-31 2010-03-30 28 2010-04-27 # 3: 2 2000-03-31 2010-04-28 100 2010-08-06 # 4: 3 2000-01-11 2003-12-29 60 2004-02-27 # 5: 3 2000-01-11 2004-02-28 1 2004-02-29 # 6: 3 2000-01-11 2004-03-10 10 2004-03-20
可以看到:
- id=2的第三行
rxdate从2010-04-08改为2010-04-28(前一行rx_end+1),rx_end同步更新为2010-08-06 - id=3的第二行
rxdate从2004-01-12改为2004-02-28,rx_end变为2004-02-29 - id=1的单条记录保持不变
内容的提问来源于stack exchange,提问作者Youknowme
相关产品推荐
相关产品推荐

