使用ggsurvplot遇行数不一致报错:多删失值设置问题求助
ggsurvplot多删失值配置下的行数不匹配报错解决
问题场景
使用survival和survminer包绘制生存曲线时,通过外部变量指定多个删失值会触发行数不匹配错误,但直接将数值写入公式则正常运行。报错提示:
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 1169, 2
复现代码
出错的代码:
library(survival) library(survminer) cnsr_values <- c(1,2) fit <- surv_fit(Surv(AVAL, !CNSR %in% cnsr_values) ~ TRTKEY, data = testdata) myplot <- ggsurvplot(fit, data = testdata, conf.int = FALSE)
可正常运行的代码(直接写入数值):
fit <- surv_fit(Surv(AVAL, !CNSR %in% c(1,2)) ~ TRTKEY, data = testdata) myplot <- ggsurvplot(fit, data = testdata, conf.int = FALSE)
额外测试发现:将数据集截断为testdata[1:1168,]传入ggsurvplot也能正常运行,且两种方式生成的fit对象无明显差异。
解决方案
方案1:提前生成事件指示变量
在数据集中预先计算事件标记列,避免公式解析时的环境混淆:
testdata$event_flag <- !testdata$CNSR %in% c(1,2) fit <- surv_fit(Surv(AVAL, event_flag) ~ TRTKEY, data = testdata) myplot <- ggsurvplot(fit, data = testdata, conf.int = FALSE)
方案2:用I()包裹逻辑表达式
强制R正确解析公式中的外部变量,避免维度识别错误:
cnsr_values <- c(1,2) fit <- surv_fit(Surv(AVAL, I(!CNSR %in% cnsr_values)) ~ TRTKEY, data = testdata) myplot <- ggsurvplot(fit, data = testdata, conf.int = FALSE)
原因说明
问题根源是公式解析环境的混淆:当在Surv函数中引用外部向量cnsr_values时,surv_fit没有正确将逻辑表达式解析为与数据集行数一致的事件向量,导致ggsurvplot匹配数据时误将cnsr_values的长度(2)当成数据行数,触发不匹配错误。上述两种方案都能让surv_fit正确识别事件向量的维度,解决报错问题。
内容的提问来源于stack exchange,提问作者Elin Zhang
相关产品推荐
相关产品推荐

