最近整理我GitHub代码,发现了之前一个批量生存分析代码是有问题的,因为不同基因表达量分组后,没有道理所有基因出图的P值不变,更诡异的是,lapply内部变量不识别,一定要外部变量。
为了给大家讲清楚这个故事,我创造了测试数据和代码,你们可以打开电脑的R语言开始表演啦! 下面代码会报错: rm(list = ls()) library(survival) library(survminer) dat=data.frame(sample(1:1000,200), sample(0:1,200,T), rnorm(200), sample(LETTERS[1:5],200,T)) table(dat$subtype) colnames(dat)=c("OS.time","OS","MATH","subtype") lapply(split(dat,dat$subtype), function(x){
x$group <- ifelse(x$MATH > median(x$MATH), "High","Low") table(x$group) mySurv_OS=with(x,Surv(OS.time, OS)) sfit=survfit(mySurv_OS~group,data=x) ggsurvplot(sfit,pval =TRUE )
})
很诡异的报错, 首先是说找不到X这个变量,实际情况是lapply里面的X是有的,单独运行不会报错,被包裹在lapply里面就出现问题,然后是出图的P值不变,这个bug也是需要解决的。 经过在VIP群里的讨论,把apply替换为for就可以运行: rm(list = ls()) library(survival) library(survminer) dat=data.frame(sample(1:1000,200), sample(0:1,200,T), rnorm(200), sample(LETTERS[1:5],200,T)) table(dat$subtype) colnames(dat)=c("OS.time","OS","MATH","subtype") l=split(dat,dat$subtype) rm(x) for (i in 1:length(l)) { x=l[[i]] x$group <- ifelse(x$MATH > median(x$MATH), "High","Low") table(x$group) mySurv_OS=with(x,Surv(OS.time, OS)) sfit=survfit(mySurv_OS~group,data=x) print( ggsurvplot(sfit,pval =TRUE)) #ggsave(paste0(i,'.png')) }
大家可以把两个代码测试一下,欢迎留言讨论你的理解。
|