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

如何用R转换生存分析累积风险数据以适配Excel阶梯图绘制

用R转换累积风险数据适配Excel阶梯图的简便方法

我正在为客户开展项目,要求所有图表在Excel中制作。其中需绘制累积风险图,数据通过Survival::survfit函数获取。问题在于Excel无法直接绘制阶梯图,需转换数据:让每个时间点出现两次,一次对应前一个累积风险值,一次对应当前时间点的累积风险值。手动在Excel操作虽简单但繁琐耗时,作为R语言新手,尚未找到解决方法。

现有代码与原始数据

# Load survival package
library(survival)

# Create survfit object
Survival_Function <- survfit(Surv(lung$time,
                                 lung$status == 2)~1)

# Extract cumulative hazards
cumhaz <- data.frame(Survival_Function$time, Survival_Function$cumhaz)

head(cumhaz)

运行后得到的原始数据:

Survival_Function.time Survival_Function.cumhaz
1                      5              0.004385965
2                     11              0.017601824
3                     12              0.022066110
4                     13              0.031034720
5                     15              0.035559606
6                     26              0.040105061

目标数据格式(适配Excel阶梯图)

Survival_Function.time Survival_Function.cumhaz
1                      5              0.004385965
2                     11              0.004385965
3                     11              0.017601824
4                     12              0.017601824
5                     12              0.022066110
6                     13              0.022066110
7                     13              0.031034720
8                     15              0.031034720
9                     15              0.035559606
10                    26              0.035559606
11                    26              0.040105061

解决方案

方法1:基础R实现(适合新手理解)

无需额外安装包,用基础循环即可完成转换:

# 初始化结果数据框,先加入第一行原始数据
step_data <- cumhaz[1, ]

# 从第二行开始遍历原始数据
for (i in 2:nrow(cumhaz)) {
  # 添加「当前时间 + 上一行累积风险」的行
  step_data <- rbind(step_data, data.frame(
    Survival_Function.time = cumhaz$Survival_Function.time[i],
    Survival_Function.cumhaz = cumhaz$Survival_Function.cumhaz[i-1]
  ))
  # 添加当前行的原始数据
  step_data <- rbind(step_data, cumhaz[i, ])
}

# 查看转换后的数据
head(step_data, 11)

方法2:dplyr+tidyr实现(更简洁高效)

如果习惯用tidyverse系列工具,代码更简洁:

library(dplyr)
library(tidyr)

step_data <- cumhaz %>%
  # 生成前一个时间点的累积风险值
  mutate(prev_cumhaz = lag(Survival_Function.cumhaz)) %>%
  # 移除第一行(其前风险值为NA),拆分每行成两行
  slice(-1) %>%
  pivot_longer(
    cols = c(prev_cumhaz, Survival_Function.cumhaz),
    values_to = "Survival_Function.cumhaz"
  ) %>%
  # 保留需要的列,合并第一行原始数据并排序
  select(Survival_Function.time, Survival_Function.cumhaz) %>%
  bind_rows(cumhaz[1, ], .) %>%
  arrange(Survival_Function.time, Survival_Function.cumhaz)

# 查看结果
head(step_data, 11)

内容的提问来源于stack exchange,提问作者Asger Paludan-Müller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:35:23