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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:27:07