在R中基于指定日期筛选最接近的HIV病毒载量日期及对应结果
筛选与妊娠日期最接近的HIV病毒载量记录
实现思路
把宽格式的病毒载量数据转为长格式,按个体计算每条病毒载量记录与妊娠日期的差值,筛选出差值最小的记录后,再合并回原数据,就能高效得到目标结果。
代码实现
# 加载所需工具包 library(dplyr) library(tidyr) # 1. 批量转换日期列为日期格式(原数据是字符型,无法计算差值) df <- df %>% mutate(across(c(starts_with("HIV_VL_result_date"), preg_date), as.Date)) # 2. 将宽格式数据转为长格式,整合6组病毒载量日期和结果 df_long <- df %>% pivot_longer( cols = starts_with(c("HIV_VL_result_date", "VL_results")), names_to = c(".value", "num"), names_pattern = "(HIV_VL_result_date|VL_results)_(\\d+)" ) %>% rename(vl_date = HIV_VL_result_date, vl_result = VL_results) %>% filter(!is.na(vl_date)) # 剔除无有效病毒载量记录的行 # 3. 计算日期差,筛选每个个体最接近的记录 closest_vl <- df_long %>% mutate(date_diff = abs(vl_date - preg_date)) %>% group_by(subject_id) %>% slice_min(date_diff, n = 1, with_ties = FALSE) %>% # 取差值最小的1条,若有多个相同差值取第一条 ungroup() %>% select(subject_id, vl_closest_date = vl_date, vl_results_closest = vl_result) # 4. 把筛选结果合并回原数据 df_final <- df %>% left_join(closest_vl, by = "subject_id") # 查看最终结果 print(df_final)
关键步骤说明
- 日期转换:用
across批量处理所有日期列,确保后续能正常计算日期差值。 - 长格式转换:通过
names_pattern自动拆分原列名的数字后缀,把分散的6组日期和结果整合为统一的两列,大幅简化按个体的批量处理逻辑。 - 筛选逻辑:
slice_min可以直接按分组筛选出差值最小的记录,避免手动比较多列差值的繁琐操作。 - 数据合并:用
left_join保留原数据的所有字段,同时新增目标列,不破坏原有数据结构。
结果示例
处理后的数据会新增vl_closest_date和vl_results_closest两列,例如:
- 个体
232-5467的妊娠日期为2022-03-04,最接近的病毒载量记录日期是2022-03-07,结果为LDL - 个体
232-6784的妊娠日期为2022-08-13,最接近的记录日期是2022-08-15,结果为375
内容的提问来源于stack exchange,提问作者Thandi
相关产品推荐
相关产品推荐

