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

编写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)

代码说明

  1. 数据预处理:将日期转换为标准格式,提取剂量的数值部分以便计算
  2. 累计分组划分:通过计算相邻给药的间隔天数,自动划分累计组,确保仅间隔≤7天的连续给药才会累计剂量
  3. 累计剂量计算:在每个累计组内用cumsum()实现剂量累计,再转换回带mg的显示格式
  4. 间隔变量处理:用lead()获取下一条给药日期计算间隔,最后一条记录强制设置为24
  5. 格式整理:将日期转回原显示格式,调整列顺序匹配期望输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:47:01