编写R脚本实现带停药期的累计剂量及相关衍生变量计算
R脚本实现给药数据处理需求
需求说明
- 同一给药途径下,仅对间隔不超过7天的连续给药进行剂量累计,生成
total dosage变量;间隔超过7天则重置累计 - 生成
给药日期+7天后剂量变量(按期望输出,该值与对应记录的累计剂量一致) - 生成
interval to next date变量:当前给药日到下一次给药日的间隔天数,最后一条记录的间隔设为24
模拟数据
# 构造模拟数据 df <- data.frame( id = c(1,1,1,1), date = c("10.01.23", "11.01.23", "12.01.23", "20.01.23"), route = c("patch", "patch", "patch", "patch"), form = c("pc", "pc", "pc", "pc"), dosage = c("30mg", "30mg", "30mg", "30mg") )
期望输出
输出1(含累计剂量与7天后剂量)
id date route form dosage total dosage dosage after date +7 days 1 10.01.23 patch pc 30mg 30mg 30mg 1 11.01.23 patch pc 30mg 60mg 60mg 1 12.01.23 patch pc 30mg 90mg 90mg 1 20.01.23 patch pc 30mg 30mg 30mg
输出2(新增间隔变量)
id date interval to next date route form dosage total dosage dosage after date +7 days 1 10.01.23 1 patch pc 30mg 30mg 30mg 1 11.01.23 1 patch pc 30mg 60mg 60mg 1 12.01.23 8 patch pc 30mg 90mg 90mg 1 20.01.23 24 patch pc 30mg 30mg 30mg
R实现脚本
library(dplyr) library(lubridate) # 数据处理流程 df_processed <- df %>% # 预处理:转换日期格式、提取剂量数值 mutate( date = dmy(date), dosage_num = as.numeric(sub("mg", "", dosage)) ) %>% # 按id和给药途径分组,排序日期 group_by(id, route) %>% arrange(date) %>% # 划分累计分组:间隔超7天或首条记录则开启新组 mutate( days_since_last = as.numeric(date - lag(date)), cum_group = cumsum(is.na(days_since_last) | days_since_last > 7) ) %>% # 在累计组内计算累计剂量 group_by(id, route, cum_group, .add = TRUE) %>% mutate( `total dosage` = paste0(cumsum(dosage_num), "mg") ) %>% # 回到id和route分组,计算剩余变量 group_by(id, route) %>% mutate( # 按期望输出赋值7天后剂量 `dosage after date +7 days` = `total dosage`, # 计算下一次给药间隔 `interval to next date` = as.numeric(lead(date) - date), # 最后一条记录间隔设为24 `interval to next date` = ifelse(is.na(`interval to next date`), 24, `interval to next date`) ) %>% # 整理格式与列顺序 select(id, date, `interval to next date`, route, form, dosage, `total dosage`, `dosage after date +7 days`) %>% mutate(date = format(date, "%d.%m.%y")) %>% ungroup() %>% select(-cum_group, -days_since_last, -dosage_num) # 查看输出1 cat("输出1:\n") print(select(df_processed, -`interval to next date`), row.names = FALSE) # 查看输出2 cat("\n输出2:\n") print(df_processed, row.names = FALSE)
代码说明
- 数据预处理:将日期转换为标准格式,提取剂量的数值部分以便计算
- 累计分组划分:通过计算相邻给药的间隔天数,自动划分累计组,确保仅间隔≤7天的连续给药才会累计剂量
- 累计剂量计算:在每个累计组内用
cumsum()实现剂量累计,再转换回带mg的显示格式 - 间隔变量处理:用
lead()获取下一条给药日期计算间隔,最后一条记录强制设置为24 - 格式整理:将日期转回原显示格式,调整列顺序匹配期望输出
内容的提问来源于stack exchange,提问作者db2020
相关产品推荐
相关产品推荐

