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

使用survminer::ggsurvplot_combine报原子向量错误求助

问题:合并生存曲线对象后调用ggsurvplot_combine报错“$ operator is invalid for atomic vectors”

单独绘制整体平均生存曲线avg与按b分组的生存曲线surv_b均无报错,但使用c(avg, surv_b)合并对象后,调用ggsurvplot_combine时出现错误提示:

! $ operator is invalid for atomic vectors

可复现代码如下:

require(survival)
require(survminer)
require(ggplot2)

set.seed(42)

a <- c(32,291,545, 44,3,792,352, 20,615,169, 61,156, 88,863,255, 33,132,5,
       63,8,964,831, 55,133, 12, 54,261,867, 17, 12,699,233,251,446, 43,223, 
       374, 75, 34, 69,120, 84,134,8,806,8, 48, 86,211, 2436, 61, 81, 87, 12, 
       838, 34, 17,141, 44,155,128,6, 29, 16, 16, 34,130,430,325, 41, 28, 53,
       32,291,545, 44,3,792,352, 20,615,169, 61,156, 88,863,255, 33,132,5,
       63,8,964,831, 55,133, 12, 54,261,867, 17, 12,699,233,251,446, 43,223,
       86, 54,3,630, 93,699, 25,746,6, 46, 22, 60,395,402,151, 26, 38,125, 
       75, 34, 69,120, 84,134,8,806,8, 48, 86,211, 2436, 61,
       191, 49, 59,6, 34, 56,2, 96, 422, 45, 70)

b <- sample(c("Alpha", "Beta", "Gamma"), length(a), replace = T)
c <- sample(0:1, length(a), replace = T)
df <- data.frame(a, b, c)
    
avg <- survfit(Surv(time = a, event = c) ~ 1, data = df)
survminer::ggsurvplot(
  avg,
  conf.int = FALSE,
  censor = FALSE,
  palette = "black",
  linetype = "dashed"      
)  

surv_b <- survfit(Surv(time = a, event = c) ~ b, data = df)
survminer::ggsurvplot(
  surv_b,
  conf.int = FALSE,
  censor = FALSE,
)  

surv_comb <- c(avg, surv_b)

survminer::ggsurvplot_combine(
  surv_comb, 
  data = df,
  combine = TRUE,
  censor = FALSE,
  legend = "right"
)

错误原因分析

survfit()返回的是survfit类对象,本质是特殊的列表结构。直接用c(avg, surv_b)合并时,R会将这些对象拆解成原子向量(把每个survfit对象的元素逐个拼接),导致最终的surv_comb变成原子向量,而ggsurvplot_combine()要求输入的是survfit对象组成的列表,无法对原子向量使用$操作符提取元素,因此报错。

解决方案

改用list()函数将多个survfit对象包装成列表,而不是用c()合并。修改后的代码如下:

require(survival)
require(survminer)
require(ggplot2)

set.seed(42)

a <- c(32,291,545, 44,3,792,352, 20,615,169, 61,156, 88,863,255, 33,132,5,
       63,8,964,831, 55,133, 12, 54,261,867, 17, 12,699,233,251,446, 43,223, 
       374, 75, 34, 69,120, 84,134,8,806,8, 48, 86,211, 2436, 61, 81, 87, 12, 
       838, 34, 17,141, 44,155,128,6, 29, 16, 16, 34,130,430,325, 41, 28, 53,
       32,291,545, 44,3,792,352, 20,615,169, 61,156, 88,863,255, 33,132,5,
       63,8,964,831, 55,133, 12, 54,261,867, 17, 12,699,233,251,446, 43,223,
       86, 54,3,630, 93,699, 25,746,6, 46, 22, 60,395,402,151, 26, 38,125, 
       75, 34, 69,120, 84,134,8,806,8, 48, 86,211, 2436, 61,
       191, 49, 59,6, 34, 56,2, 96, 422, 45, 70)

b <- sample(c("Alpha", "Beta", "Gamma"), length(a), replace = T)
c <- sample(0:1, length(a), replace = T)
df <- data.frame(a, b, c)
    
avg <- survfit(Surv(time = a, event = c) ~ 1, data = df)
survminer::ggsurvplot(
  avg,
  conf.int = FALSE,
  censor = FALSE,
  palette = "black",
  linetype = "dashed"      
)  

surv_b <- survfit(Surv(time = a, event = c) ~ b, data = df)
survminer::ggsurvplot(
  surv_b,
  conf.int = FALSE,
  censor = FALSE,
)  

# 改用list()包装多个survfit对象
surv_comb <- list(avg, surv_b)

survminer::ggsurvplot_combine(
  surv_comb, 
  data = df,
  combine = TRUE,
  censor = FALSE,
  legend = "right"
)

这样修改后,surv_comb是包含两个survfit对象的列表,符合ggsurvplot_combine()的输入要求,就能正常绘制合并后的生存曲线了。

内容的提问来源于stack exchange,提问作者Reader 123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:12:57