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

如何合并数据集并保留手术日期前最近的各类型血压测量记录?

问题:合并手术日期与术前血压数据,保留每种血压类型最接近手术日的术前记录

数据集定义

手术日期数据集(data1)

data1 <- tribble(
  ~MRN, ~date_in_room,
  1, "2015-01-02"
) %>% mutate(date_in_room = as.Date(date_in_room))

术前血压测量数据集(data2)

library(dplyr)

data2 <- tribble(
  ~MRN, ~event, ~date, ~value,
  1, "sbp", "2014-12-31", 120,
  1, "sbp", "2015-01-01", 119,
  1, "sbp", "2015-01-02", 125,
  1, "dbp", "2015-01-01", 80,
  1, "dbp", "2015-01-02", 84,
  1, "mean", "2015-01-01", 100
) %>% mutate(date = as.Date(date))

需求说明

合并两个数据集,仅保留每个患者(MRN)下每种血压测量类型(event:sbp/dbp/mean)中,日期早于手术日期且最接近手术日的记录。

初始代码(待补充)

data1 |> 
  group_by(MRN, event) |> 
  left_join(data2, by=MRN) |>
...?

完整实现代码

data1 |> 
  left_join(data2, by = "MRN") |> 
  # 筛选手术日期之前的血压记录
  filter(date < date_in_room) |> 
  # 按患者ID和血压类型分组
  group_by(MRN, event) |> 
  # 组内按测量日期降序排列,最接近手术日的记录排首位
  arrange(desc(date), .by_group = TRUE) |> 
  # 提取每组第一条记录
  slice_head(n = 1) |> 
  # 取消分组
  ungroup() |> 
  # 调整列顺序以匹配预期结果
  select(MRN, event, date, value, date_in_room)

代码说明

  1. left_join(data2, by = "MRN"):按患者ID合并两个数据集,确保所有手术记录都被保留;注意by参数需要用引号包裹列名。
  2. filter(date < date_in_room):剔除手术当日及之后的血压数据,只保留术前记录。
  3. group_by(MRN, event):按患者和血压类型分组,保证每种血压类型单独筛选最接近手术日的记录。
  4. arrange(desc(date), .by_group = TRUE):在每个分组内按测量日期降序排序,这样最接近手术日的记录会排在组内第一位。
  5. slice_head(n = 1):提取每组的第一条记录,也就是符合要求的目标数据。
  6. ungroup():取消分组状态,避免后续数据操作受到分组限制。
  7. select(...):调整列的顺序,和预期结果的列顺序保持一致。

运行上述代码后,输出结果与预期的desired数据集完全一致。

内容的提问来源于stack exchange,提问作者John Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:27:41