如何在R语言中用dplyr结合多条件ifelse汇总生存数据
生存数据分组汇总问题解决
原始数据
df <- data.frame ( ID = c(1,1,1,2,2,2,3,3,3), Timepoint = c(1,2,3,1,2,3,1,2,3), Days = c(0,22,198,0,21,199,0,23,197), Status = c("Alive","Dead","Dead","Alive","Alive","Missing","Alive","Alive","Alive"))
需求说明
按ID分组汇总为每行对应一个ID,需满足以下规则:
- 若Status变为Dead,
SurvAge取首次出现Dead的时间点与最后一次Alive时间点的Days中间值; - 若Status变为Missing,
SurvAge取最后一次记录为Alive的时间点的Days数值; - 若Status始终为Alive至最后一个时间点,
SurvAge取最后一个时间点的Days数值; - 新增
Event列:变为Dead的ID标记为1,保持Alive或变为Missing的标记为0。
目标结果
| ID | SurvAge | Event |
|---|---|---|
| 1 | 11 | 1 |
| 2 | 21 | 0 |
| 3 | 197 | 0 |
尝试的错误代码
data2 = data %>% group_by (ID) %>% summarize(SurvAge = if_else(!is.na(match(Status, "Missing")), Days[which(Status="Alive", last())], if_else(!is.na(match(Status,"Dead")), mean(Days[which(Status="Alive",last()):which(Status="Dead", first)])), if_else(Days[which(Status="Alive", last())])), Event=(sum(match(Status, "Dead"), na.rm = TRUE) == 1)) data2 = data %>% group_by (ID) %>% summarize(SurvAge = if(Timepoint == 2 & Status== "Missing") {Days[which(data$Status =="Alive", last())]} else if (Timepoint == 2 & Status=="Dead") {mean(Days[which(Status="Alive",last()):which(Status="Dead", first)])} else if(Timepoint == 3 & Status== "Missing") {Days[which(data$Status =="Alive", last())]} else if (Timepoint == 3 & Status=="Dead") {mean(Days[which(Status="Alive",last()):which(Status="Dead", first)])} else {Days(max())})
解决方案
使用dplyr分组后提取关键节点信息,通过条件判断计算目标值:
library(dplyr) result <- df %>% group_by(ID) %>% mutate( # 获取最后一次Alive的Days值 last_alive_days = last(Days[Status == "Alive"]), # 获取首次Dead的Days值 first_dead_days = first(Days[Status == "Dead"]) ) %>% summarize( SurvAge = case_when( # 存在Dead状态时取中间值 "Dead" %in% Status ~ mean(c(last_alive_days, first_dead_days)), # 存在Missing状态时取最后一次Alive的Days "Missing" %in% Status ~ last_alive_days, # 始终Alive则取最后一个时间点的Days TRUE ~ last(Days) ), # 标记Event列 Event = ifelse("Dead" %in% Status, 1, 0) ) print(result)
运行后输出结果:
# A tibble: 3 × 3 ID SurvAge Event <dbl> <dbl> <dbl> 1 1 11 1 2 2 21 0 3 3 197 0
内容的提问来源于stack exchange,提问作者Eveline
相关产品推荐
相关产品推荐

