使用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
相关产品推荐
相关产品推荐

