我试图通过使用函数对几个基因进行生存分析。根据“高”(2)或“低”(1)基因表达对患者进行分组。
我对R如何理解我的代码感到困惑。以下是一些示例数据:
df <- read.table(header=T, text="TGM5 TGM6 TGM7 TPI1 survival vital.status
2 1 1 2 1.419178082 2
2 1 1 1 5 1
2 1 1 2 1.082191781 2
1 1 1 1 0.038356164 1
2 1 2 2 0.77260274 2
1 1 2 2 2.336986301 1
2 1 2 1 1.271232877 1")
以下代码可以正常工作:
fit<- survfit(Surv(survival, vital.status)~TGM5), data =df)
我遇到的问题是我想为许多基因做这件事。我已经创建了一个我感兴趣的基因名称数组/列表:
> genes <- names(df[1:3])
> genes[1]
[1] "TGM5"
但如果我打电话
fit<- survfit(Surv(survival, vital.status)~genes[1]), data =df)
我收到错误
Error in model.frame.default(formula = Surv(survival, vital.status) ~ (genes[1]), :
variable lengths differ (found for 'genes[1]')
我认为当我直接调用TGM5与从基因列表中调用它作为元素的时候存在差异,并且解决方案非常简单。我对如何解决这个问题感到很茫然。 我尝试过使用gsub()但没有成功。
最后,由于我想将这些代码扩展到许多基因上,我想避免创建一个for循环,是否有一种矢量化方式可以解决这个问题?
非常感谢。
答案 0 :(得分:1)
这个黑客有效:
survfit(as.formula(paste0("Surv(survival, vital.status)~",genes[1])), data =df)
Call: survfit(formula = as.formula(paste0("Surv(survival, vital.status)~",
genes[1])), data = df)
n events median 0.95LCL 0.95UCL
TGM5=1 2 0 NA NA NA
TGM5=2 5 3 1.42 1.08 NA
我将公式粘贴在一起,然后将其强制转换为公式对象。有一个名为reformulate
的更好的功能,通常可以为此工作,但我无法使用
Surv(survival, vital.status)
作为响应参数级别。
数据强>
df <- read.table(header=T, text="TGM5 TGM6 TGM7 TPI1 survival vital.status
2 1 1 2 1.419178082 2
2 1 1 1 5 1
2 1 1 2 1.082191781 2
1 1 1 1 0.038356164 1
2 1 2 2 0.77260274 2
1 1 2 2 2.336986301 1
2 1 2 1 1.271232877 1")
答案 1 :(得分:0)
您需要删除引号:noquote(genes[1])