R语言处理患者数据:提取非负日期差值生成基线与随访变量
R语言处理HbA1c随访日期差值列方案
针对你的需求,我们可以用tidyverse工具链实现,核心思路是把宽格式的日期差值列转为长格式,按患者分组处理后再转回宽格式。以下是具体步骤和代码:
1. 构造示例数据(模拟你的数据集结构)
library(tidyverse) set.seed(123) sample_data <- tibble( Pat_id = 1:3, 年龄 = c(45, 52, 38), 种族 = c("亚裔", "非裔", "白人"), Hb_m_days_HbA1c_Date_1 = c(0, -5, 10), Hb_m_days_HbA1c_Date_2 = c(30, 0, -2), Hb_m_days_HbA1c_Date_3 = c(90, 60, 30), Hb_m_days_HbA1c_Date_4 = c(-10, 120, 60) )
2. 核心处理代码
processed_data <- sample_data %>% # 将所有Hb_m_days开头的列转成长格式 pivot_longer( cols = starts_with("Hb_m_days_HbA1c_Date_"), names_to = "temp_col", values_to = "days_diff" ) %>% # 过滤掉负数值 filter(days_diff >= 0) %>% # 按患者ID分组处理 group_by(Pat_id) %>% # 按差值从小到大排序,确保基线(0)排在最前面 arrange(days_diff, .by_group = TRUE) %>% # 生成目标列名:0对应baseline,其余按顺序生成followup_1至followup_12 mutate( target_col = case_when( days_diff == 0 ~ "baseline", TRUE ~ str_c("followup_", row_number() - sum(days_diff == 0)) ) ) %>% # 只保留followup_1到followup_12,超出的自动过滤 filter(!str_detect(target_col, "followup_1[3-9]|followup_\\d{2,}")) %>% # 转回宽格式,缺失值用NA填充 pivot_wider( names_from = target_col, values_from = days_diff, values_fill = NA ) %>% # 合并原数据中的非日期差值列(确保所有患者都被保留) right_join(sample_data %>% select(-starts_with("Hb_m_days_HbA1c_Date_")), by = "Pat_id") %>% # 调整列顺序,把基础信息列放在前面 select(Pat_id, 年龄, 种族, baseline, starts_with("followup_"))
3. 代码说明
- pivot_longer:把分散在多列的日期差值转为单列,方便按患者分组统一处理
- filter(days_diff >=0):直接剔除所有负的差值
- arrange:确保每个患者的差值按从小到大排序,基线0会排在最前面
- mutate(target_col):根据差值生成对应的目标列名,自动计算followup的序号
- pivot_wider:把处理后的长格式数据转回宽格式,得到你需要的baseline和followup列
- right_join:保证原数据中所有患者都能被保留,即使部分followup列没有数据(用NA填充)
4. 边缘情况处理
如果部分患者没有0值(即无基线日期),baseline列会显示NA,你可以根据实际需求添加处理逻辑,比如:
processed_data <- processed_data %>% mutate(baseline = ifelse(is.na(baseline), "无基线数据", baseline))
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

