R语言基于基准日期计算天数并生成Dref列的实现方法
解决方法
先加载所需的tidyverse包(包含dplyr用于数据处理,lubridate用于日期操作),然后按以下步骤处理数据:
library(tidyverse) # 原数据 df <- tibble::tribble( ~SUBJID, ~ARM, ~TIMEPOINT, ~TP.DATE, ~TPR_ar, ~TPR_ir, 1, "A", "BL0", "2020-05-13", "Undefined", "Undefined", 1, "A", "FU1", "2020-08-04", "SD", "SD", 1, "A", "FU2", "2020-10-06", "PR", "PR", 1, "A", "FU3", "2020-12-10", "PR", "PR", ) # 数据处理 df_processed <- df %>% # 转换日期格式为可计算的日期对象 mutate(TP.DATE = ymd(TP.DATE)) %>% # 按受试者和组别分组,确保每组用自身BL0日期做基准 group_by(SUBJID, ARM) %>% # 提取BL0基准日,计算与各时间点的天数差并转成字符型 mutate( base_date = first(TP.DATE[TIMEPOINT == "BL0"]), Dref = as.character(as.integer(TP.DATE - base_date)) ) %>% ungroup() %>% # 保留指定时间点的行 filter(TIMEPOINT %in% c("BL0", "FU1", "FU2")) %>% # 移除临时基准日列 select(-base_date) # 查看最终结果 print(df_processed)
步骤说明
- 日期格式转换:用
ymd()将字符型的日期转为R可识别的日期对象,为后续计算间隔做准备。 - 分组逻辑:按
SUBJID和ARM分组,确保多受试者/多组别场景下,每个组都使用自己的BL0日期作为基准。 - 天数间隔计算:提取当前组内BL0对应的日期作为基准,计算每个时间点与基准日的天数差,转成字符型以匹配目标结果格式。
- 行筛选:仅保留
BL0、FU1、FU2三个时间点的数据。 - 临时列清理:移除用于计算的临时基准日列,得到干净的最终结果。
运行后得到的结果与需求完全一致:
# A tibble: 3 × 7 SUBJID ARM TIMEPOINT TP.DATE TPR_ar TPR_ir Dref <dbl> <chr> <chr> <date> <chr> <chr> <chr> 1 1 A BL0 2020-05-13 Undefined Undefined 0 2 1 A FU1 2020-08-04 SD SD 83 3 1 A FU2 2020-10-06 PR PR 146
内容的提问来源于stack exchange,提问作者D. Shin
相关产品推荐
相关产品推荐

