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

如何在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。

目标结果

IDSurvAgeEvent
1111
2210
31970

尝试的错误代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:20:24