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

如何在dplyr的case_when()中仅标记每个时间点的首个事件?

标记数据框中每个时间区间的首个事件

你需要在含多时间点的数据框中,仅标记每个时间区间内的首个事件(而非该区间的全部事件),之前用case_when/if_else会给区间内所有事件赋值,无法满足时间线分析的单次标记需求,可通过分组排序+去重判断实现,具体方案如下:

核心思路

  1. 按个体(如患者ID)分组,同时按时间戳排序,确保事件按时间先后顺序排列
  2. 先划分目标时间区间,再在每个分组内,判断当前事件是否为对应区间的首次出现,仅标记首次事件

示例代码

library(tidyverse)

# 读取并预处理数据
data <- read_csv("my_data.csv")

processed_data <- data %>%
  # 按个体ID和受伤后月份排序,保证时间顺序正确
  arrange(patient_id, time_from_injury_months) %>%
  group_by(patient_id) %>%
  mutate(
    # 定义时间区间(补充你提到的12-24个月区间)
    time_interval = case_when(
      accepted_reduction == "x" ~ "0",
      time_from_injury_months >= 12 & time_from_injury_months < 24 ~ "1",
      time_from_injury_months >= 24 & time_from_injury_months < 36 ~ "2",
      time_from_injury_months >= 36 & time_from_injury_months < 48 ~ "3",
      time_from_injury_months >= 48 & time_from_injury_months < 60 ~ "4"
    ),
    # 仅标记每个区间的首个事件:1表示是首个事件,0表示不是
    is_first_event = ifelse(!duplicated(time_interval) & !is.na(time_interval), 1, 0)
  ) %>%
  ungroup()

变体需求处理

如果需要直接保留首个事件的区间标记,其余同区间事件的区间字段设为NA,可修改代码如下:

processed_data <- data %>%
  arrange(patient_id, time_from_injury_months) %>%
  group_by(patient_id) %>%
  mutate(
    time_interval = case_when(
      accepted_reduction == "x" ~ "0",
      time_from_injury_months >= 12 & time_from_injury_months < 24 ~ "1",
      time_from_injury_months >= 24 & time_from_injury_months < 36 ~ "2",
      time_from_injury_months >= 36 & time_from_injury_months < 48 ~ "3",
      time_from_injury_months >= 48 & time_from_injury_months < 60 ~ "4"
    ),
    # 仅保留每个区间首个事件的区间值,其余设为NA
    first_event_timepoint = ifelse(!duplicated(time_interval) & !is.na(time_interval), time_interval, NA)
  ) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:43:21