记录自己for循环对实际情况的问题解决
一般的简单的批量绘制生存曲线直接复制粘贴代码运行没啥问题,可偏偏自己这次遇上的是不一般的分析任务,一共3个文件夹,每个文件夹有13个表格,每个表格里有41个分组,1500+个图。唯独自己犯傻,一个很简单的报错看了半天才看出来,作此记录警醒自己。
一、创建工作目录
这里懒所以直接批量创建文件夹了,用英文分号隔开,文件夹较多可先用excel处理后copy过来
二、简单的循环示例
#加载包
library("survminer")
library("survival")
#导入示例数据并查看
colon=colon
View(colon)
#提取分组变量
genes <- names(colon)[3:10]
genes
# 循环并保存图片
for (i in genes){
print(i)
fit <- survfit(Surv( time,status) ~ colon[,i], colon)
p <- ggsurvplot(fit, linetype = "strata",
pval = TRUE,
palette = "Dark2",
legend.labs =c(paste0(i, "=H"), paste0(i, "=L")))
pdf(paste0(i, "_surv.pdf"),width = 5, height = 5)
print(p, newpage = FALSE)
dev.off()
}
已全部导出,点开一个查看
三、对这个小破任务批量生存分析
#install.packages("survminer")
library(survival)
library(survminer)
library(readxl)
library(readr)
rm(list = ls())
getwd()
setwd("C:\\Users\\xzw\\Desktop\\Q_tumor\\Target_Q_10")
data <- read_csv("Target_Q_10.csv",show_col_types = FALSE)
这里设置标题居中无需改动
###设置标题居中主题####
custom_theme <- function()
{theme_survminer() %+replace%
theme(plot.title=element_text(hjust=0.5))
}
##############################################for循环绘制全部生存曲线###############################################
genes <- names(data)[4:14]
data <- as.data.frame(data)
genes
######一重奏######
for (i in genes) {
print(i)
fit <- survfit(Surv(time, status) ~data[,i], data = data) #绘制两组生存曲线
summary(fit)
p1 <- ggsurvplot(fit,
data,
pval = TRUE,
conf.int = TRUE,
fun="pct",
size=1,
risk.table = TRUE,
risk.table.col = "strata",
linetype = "strata",
palette = c("lightseagreen", "goldenrod1"),
legend = c(0.8, 0.85),
legend.title = "Group",
#legend.labs = c("Hight","Low-S"),
legend.labs = c("Low","Hight-S"),
title=paste0(i),
surv.median.line = "hv",
ggtheme=custom_theme(),
)
p1
pdf(paste0(i, "_surv.pdf"),width = 7, height = 5)
print(p1, newpage = FALSE)
dev.off()
}
导出结果即可查看
有人会发现为什么标签有两个,还注释了一个,因为部分举例像TNFSF,TNFRSF等起反作用的,需要标为Low,因此下面挑选出带TNF的重新跑一遍覆盖掉原图即可
#####################################################TNF修改一下列名#############################################
TNF=data[c(grep("TNF",colnames(data)))]
genes <- names(TNF)[1:2]
data <- as.data.frame(data)
######二重奏######
genes
for (i in genes) {
print(i)
fit <- survfit(Surv(time, status) ~data[,i], data = data)
summary(fit)
p1 <- ggsurvplot(fit,
data,
pval = TRUE,
conf.int = TRUE,
fun="pct",
size=1,
risk.table = TRUE,
risk.table.col = "strata",
linetype = "strata",
palette = c("lightseagreen", "goldenrod1"),
legend = c(0.8, 0.85),
legend.title = "Group",
legend.labs = c("Hight","Low-S"),
#legend.labs = c("Low","Hight-S"),
title=paste0(i),
surv.median.line = "hv",
ggtheme=custom_theme(),
)
p1
pdf(paste0(i, "_surv.pdf"),width = 7, height = 5)
print(p1, newpage = FALSE)
dev.off()
}
四、讨论
其实不难,但是被自己蠢哭了,一直在排查数据类型,变量是否对齐等但其实,只是因为01分类有一组标注全是1,但是代码是跑两组间生存分析的,浪费了一整个下午的时间属实把自己整无语了。
总的来说用for循环的话就改一次工作目录run一次,改一次工作目录run一次,但是现在做完了,在这写反思又顿悟了,可以写个列表,把工作目录和导入文件名也写一个for循环不就可以点一次运行坐等了,梅开二度了。