基于死亡、转院和数据收集日期在R中创建研究结束日期变量
在R中生成患者随访结束日期(end_date)的方法
示例数据
| patid | death_date | transfer_date | data_collection_end_date | end_date |
|---|---|---|---|---|
| 1 | 07/07/2018 | 07/07/2016 | 01/11/2021 | 07/07/2016 |
| 2 | 07/07/2019 | 07/07/2018 | 01/11/2021 | 07/07/2018 |
| 3 | 07/07/2020 | 07/07/2018 | 01/11/2021 | 07/07/2018 |
| 4 | NA | NA | 01/12/2021 | 01/12/2021 |
| 5 | NA | NA | 01/11/2021 | 01/11/2021 |
| 6 | NA | 07/09/2016 | 01/11/2021 | 07/09/2016 |
实现方案
第一步:转换日期格式
先确保所有日期列是R可识别的日期类型(假设原数据日期格式为日/月/年):
# Base R 写法 df$death_date <- as.Date(df$death_date, format = "%d/%m/%Y") df$transfer_date <- as.Date(df$transfer_date, format = "%d/%m/%Y") df$data_collection_end_date <- as.Date(df$data_collection_end_date, format = "%d/%m/%Y") # tidyverse 写法 library(dplyr) df <- df %>% mutate(across(c(death_date, transfer_date, data_collection_end_date), ~as.Date(., format = "%d/%m/%Y")))
第二步:生成end_date变量
方法1:Base R
利用apply按行计算三个日期的最小值(自动忽略NA):
df$end_date <- apply(df[, c("death_date", "transfer_date", "data_collection_end_date")], 1, function(x) min(x, na.rm = TRUE))
方法2:tidyverse(rowwise写法)
按行处理,逻辑更直观:
df <- df %>% rowwise() %>% mutate(end_date = min(c(death_date, transfer_date, data_collection_end_date), na.rm = TRUE)) %>% ungroup()
方法3:tidyverse(pmap写法)
适合批量处理场景:
library(purrr) df <- df %>% mutate(end_date = pmap_dbl(list(death_date, transfer_date, data_collection_end_date), min, na.rm = TRUE) %>% as.Date(origin = "1970-01-01"))
以上三种方法都能实现需求:当death_date和transfer_date存在有效值时,取三者中的最早日期;当两者均为NA时,自动取data_collection_end_date的值。
内容的提问来源于stack exchange,提问作者abrar_r
相关产品推荐
相关产品推荐

