这是因为基因的名称包含-
which base::str2lang
视为数学表达式。我们可以按如下方式修复此问题:
- 要转换的“干净”基因名称
-
to _
并将其记录在某处。
然后我们有:
genes <- c("ABC7-42389800N19.1", "AATK-AS1")
sapply(genes,function(x)as.formula(paste('Surv(OS,status)~',
+ sub("-", "_",x))))
$`ABC7-42389800N19.1`
Surv(OS, status) ~ ABC7_42389800N19.1
<environment: 0x000002ad508b58e8>
$`AATK-AS1`
Surv(OS, status) ~ AATK_AS1
<environment: 0x000002ad508b3c30>
这是为什么会出现这种情况的说明:
A <- 4; B<- 20
str2lang("A-B")
A - B
eval(str2lang("A-B"))
[1] -16
str2lang
本质上类似于可怕的eval-parse
框架。从文档来看,它的作用是这样的:
str2expression(s) 和 str2lang(s) 返回 parse(text=s, keep.source=FALSE) 的特殊版本,因此可以被视为将字符串 s 转换为表达式、调用等。
NOTE
- 由于这将用于建模,因此最好执行
sub
at the colnames
阶段,模型的输入数据具有我们期望的名称:
# not tested but you get the idea
colnames(survdata)[-c(1:3)]<-sub("-", "_",colnames(survdata)[-c(1:3)])
- 出于生物学/研究的目的,重要的是记录为什么基因名称按照本答案中的建议进行清理。