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

使用R查找个体首次满足Survival_time<time2的取值及对应子集

R语言生存数据集分组处理方案

前置说明

待处理数据集D共包含5个字段:id(个体唯一标识符)、time1、time2、二分类协变量X、Survival_time


问题1:按id分组提取首次满足条件的Survival_time

需求为每个id仅输出1条结果,取值为该个体首次出现Survival_time < time2对应的Survival_time值,推荐使用dplyr实现,代码如下:

# 加载依赖包
library(dplyr)

# 方案A:仅返回存在满足条件记录的id
result_q1 <- D %>%
  group_by(id) %>%
  filter(Survival_time < time2) %>%
  slice(1) %>% # 取每组第一条匹配记录
  ungroup() %>%
  select(id, Survival_time)

# 方案B:保留所有id,无匹配记录的对应值设为NA
result_q1_full <- D %>%
  group_by(id) %>%
  summarise(
    first_survival_time = if_else(
      condition = any(Survival_time < time2),
      true = Survival_time[which.max(Survival_time < time2)],
      false = NA_real_
    )
  ) %>%
  ungroup()

问题2:按id提取首行到首次满足条件行的全部记录

需求为每个个体仅保留从第一条记录到首次满足Survival_time < time2的记录之间的所有行,实现代码如下:

result_q2 <- D %>%
  group_by(id) %>%
  mutate(
    # 定位首次满足条件的行号,无匹配时返回NA
    first_match_row = which(Survival_time < time2)[1],
    # 确定需要保留的最大行号:无匹配时保留全部行/填0则剔除无匹配的id
    keep_max_row = ifelse(is.na(first_match_row), n(), first_match_row)
  ) %>%
  filter(row_number() <= keep_max_row) %>%
  select(-first_match_row, -keep_max_row) %>%
  ungroup()

注意事项

  • 代码基于dplyr 1.0.0及以上版本编写,低版本运行前请先升级包
  • 运行前请确认Survival_time和time2均为数值型字段,避免逻辑判断报错
  • 千万级以上超大数据集建议改用data.table包实现,运算效率更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:36:02