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

使用tidyverse为连续分组的治疗时段标记起始与终止时间点

使用tidyverse为连续分组的治疗时段标记起始与终止时间点

我来帮你搞定这个需求!你需要给每一段连续相同的治疗记录标记起始和终止时间,用tidyverse的工具就能轻松实现,咱们一步步来操作:

首先先还原你的原始数据:

library(tidyverse)

id <- rep(5, 10)
time <- c(1,2,3,4,5,6,7,8,9,10)
drug <- c("A", "A", "A", "B", "A", "D", "A", "A", "C", "B")
df <- tibble(id, time, drug)

接下来是核心处理步骤,主要分为识别连续治疗组和计算起止时间两部分:

df_result <- df %>%
  # 第一步:生成连续治疗组的标识
  # 当当前行drug和前一行不同时,分组编号+1,默认第一行的前一行是它自己
  mutate(group_id = cumsum(drug != lag(drug, default = first(drug)))) %>%
  # 按id和分组编号分组(兼容多id场景)
  group_by(id, group_id) %>%
  # 每个组的起始时间就是组内最早的time
  mutate(start = min(time)) %>%
  ungroup() %>%
  # 第二步:把下一个组的起始时间作为当前组的终止时间
  mutate(stop = lead(start))

# 查看最终结果(去掉临时的group_id)
df_result %>% select(-group_id)

运行后就能得到你想要的结果:

# A tibble: 10 × 5
     id  time drug  start  stop
  <dbl> <dbl> <chr> <dbl> <dbl>
1     5     1 A         1     4
2     5     2 A         1     4
3     5     3 A         1     4
4     5     4 B         4     5
5     5     5 A         5     6
6     5     6 D         6     7
7     5     7 A         7     9
8     5     8 A         7     9
9     5     9 C         9    10
10    5    10 B        10    NA

关键步骤解释

  • 生成连续分组标识:cumsum(drug != lag(drug, default = first(drug))) 是核心逻辑——用lag()获取前一行的治疗类型,和当前行对比,不同时返回TRUE(即数值1),通过累加得到连续相同治疗的分组ID,确保每一段连续的治疗都被分到同一个组里。
  • 计算起始时间:每个分组内的最小time就是这段治疗的开始时间。
  • 计算终止时间:用lead(start)获取下一个分组的起始时间,作为当前分组的终止时间,最后一个分组没有后续分组,所以stop自动为NA,完全符合你的预期。

这个方法还兼容多ID的场景,不用担心不同个体的治疗分组会被混淆~

备注:内容来源于stack exchange,提问作者Beres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:43:15