在医院随访数据、药物临床试验、甚至电商用户流失研究里,经常要回答一个问题:‘病人活了多久?’‘用户用了多久就卸载APP?’这类带‘时间+结局’的数据,不能简单用t检验或卡方来处理——得上生存分析。
为什么表格软件搞不定?
Excel 或 WPS 表格能算平均值、画折线图,但生存分析的核心是‘删失数据’(比如随访还没结束人就失联了)。普通表格函数压根不认这个概念,一算中位生存期就出错。这时候,R 就是那个拎着小板凳坐进统计现场的靠谱同事。
三步跑通一个真实例子
假设你手上有份肺癌患者随访表:列名是 time(存活月数)、status(1=死亡,0=删失)、treatment(A药/B药)。把它存成 CSV,比如 lung.csv。
打开 RStudio,粘贴这三段代码:
library(survival)
library(survminer)
# 读数据 + 建生存对象
dat <- read.csv("lung.csv")
surv_obj <- Surv(time = dat$time, event = dat$status)
# 分组画K-M曲线
fit <- survfit(surv_obj ~ dat$treatment)
ggsurvplot(fit, data = dat, risk.table = TRUE)回车运行,立刻弹出一张带置信区间的生存曲线图,下方还自动配了风险人数表——这就是表格技巧栏目里最实用的‘动态生存表格’:它不是静态截图,而是随数据更新实时重绘的交互式表格基底。
再加一行,p值就有了
想知道A药和B药效果差异是否显著?在上面代码末尾补一句:
surv_diff <- survdiff(surv_obj ~ dat$treatment)
print(surv_diff)输出里的 Chisq 对应的 p 值,就是 Log-rank 检验结果。不用查表、不用手动算卡方,R 把统计学‘脏活’全包了,你只管看数字说话。
提醒一句:别把 status 列填成‘死亡/存活’文字,R 只认 0 和 1;时间单位统一用‘月’或‘天’,别混着来——这些细节,恰恰是表格导入R前最容易翻车的地方。