Surv函数报错‘Time variable is not numeric’:生存分析排障求助
生存分析Surv函数报错:Time variable is not numeric的解决方法
我正在开展以**失访时间(time to loss to follow up)**为指标的生存分析,已通过csv读取函数的stringsAsFactors和colClasses参数确保“Time to LTFU”列为数值型,但调用survfit构建Kaplan-Meier模型时,仍触发错误:
Error in Surv("Time to LTFU", censored) : Time variable is not numeric
查看str(survdat)输出确认“Time to LTFU”确实是数值型,但问题仍未解决。相关代码及数据结构如下:
相关代码
library(tidyverse) library(gtsummary) library(data.table) library(tidyr) library(dplyr) library(survival) survdat <- fread("221121_HBV_Followup_survivalanalysis.csv", stringsAsFactors=FALSE, colClasses = c("Time to LTFU"="numeric")) # 创建删失变量(右删失) survdat$censored[survdat$`LTFU confirmed` == 'Yes']<- 1 survdat$censored[survdat$`LTFU confirmed` == 'No'] <-0 # 构建KM分析模型 km1 <- survfit(Surv('Time to LTFU', censored) ~ 1, data=survdat, type="kaplan-meier")
数据结构(str输出)
Classes ‘data.table’ and 'data.frame': 43 obs. of 10 variables: $ Date screened : chr "19/10/2021" "07/07/2021" "18/01/2022" "07/05/2021" ... $ Last date seen : chr "21/11/2022" "21/11/2022" "21/11/2022" "21/11/2022" ... $ Time to LTFU : num 398 502 307 563 564 605 516 29 118 118 ... $ LTFU confirmed : chr "No" "No" "No" "No" ... $ censored : num 0 0 0 0 0 0 0 1 1 0 ...
问题原因及解决办法
问题根源在于Surv()函数中变量的引用方式:你用单引号包裹Time to LTFU,这会让函数把它当作字符串字面量处理,而非引用数据框中的对应列,自然会报错“时间变量非数值型”。
有两种直接的解决方式:
方式1:用反引号包裹带空格的变量名
将单引号替换为反引号(键盘左上角的`键),让函数识别为数据框中的列:km1 <- survfit(Surv(`Time to LTFU`, censored) ~ 1, data=survdat, type="kaplan-meier")方式2:重命名变量,移除空格
读取数据后将带空格的变量名改为无空格格式,后续操作更简洁:# 重命名变量 survdat <- survdat %>% rename(time_to_ltfu = `Time to LTFU`) # 重新构建模型 km1 <- survfit(Surv(time_to_ltfu, censored) ~ 1, data=survdat, type="kaplan-meier")
额外优化建议
创建删失变量时,用向量化操作替代索引赋值,更高效且避免潜在的NA遗漏:
survdat$censored <- as.numeric(survdat$`LTFU confirmed` == 'Yes')
内容的提问来源于stack exchange,提问作者EM22
相关产品推荐
相关产品推荐

