前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >apply家族函数和for循环还是有区别的(批量生存分析出图bug)

apply家族函数和for循环还是有区别的(批量生存分析出图bug)

作者头像
生信技能树
发布2019-08-06 09:27:31
1.1K0
发布2019-08-06 09:27:31
举报
文章被收录于专栏:生信技能树

最近整理我GitHub代码,发现了之前一个批量生存分析代码是有问题的,因为不同基因表达量分组后,没有道理所有基因出图的P值不变,更诡异的是,lapply内部变量不识别,一定要外部变量。

为了给大家讲清楚这个故事,我创造了测试数据和代码,你们可以打开电脑的R语言开始表演啦!

下面代码会报错:

代码语言:javascript
复制
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就可以运行:

代码语言:javascript
复制
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'))
}

大家可以把两个代码测试一下,欢迎留言讨论你的理解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档