2013-05-21 17 views
1

如何避免出现以下错误。 as.formula()似乎没有以数字开头的变量,后面跟着_(下划线)。我正在动态生成这些变量,并且我处于不想返回并更改变量名称的阶段。 感谢R中的as.formula似乎并不接受以数字开头的名称,后跟_

lhsOfFormula = "25_dep" 
rhsOfFormula = "predVar1+predVar2+10_predVar3" 
as.formula(paste(lhsOfFormula , " ~ ", rhsOfFormula)) 

错误:

> as.formula(paste(lhsOfFormula , " ~ ", rhsOfFormula)) 
Error in parse(text = x) : <text>:1:3: unexpected input 
1: 25_ 
    ^
+7

这不是R中的有效变量名。请参阅'?make.names'。解决方案可能会返回并将所有变量名称更改为语法上有效的名称。 – joran

+1

运行grep-ish脚本将所有名称更改为语法上有效的内容真的不应该很难。以** any **语言开头的变量名称是一个很糟糕的想法。例如,有些语言将'37bongo'解释为'37 * bongo'。 –

回答

6

你需要在反引号包的名字,像这样

> lhsOfFormula <- "25_dep" 
> rhsOfFormula <- c("predVar1", "predVar2", "10_predVar3") 
> addq <- function(x) paste0("`", x, "`") 
> as.formula(paste(addq(lhsOfFormula) , " ~ ", paste(addq(rhsOfFormula),collapse=" + "))) 
`25_dep` ~ predVar1 + predVar2 + `10_predVar3` 

我还依稀记得有一个功能,以帮助创建公式,像formulate,也许?但是在我的快速搜索中我找不到任何关于它的信息。

编辑:感谢@DWin,这是reformulate,这有助于响应,但不与预测变量。这里的RHS被改变为具有有效的名称,以使代码的工作:

> lhsOfFormula = "25_dep" 
> rhsOfFormula = c("predVar1", "predVar2", "x10_predVar3") 
> reformulate(rhsOfFormula, lhsOfFormula) 
`25_dep` ~ predVar1 + predVar2 + x10_predVar3 

编辑:直接应用式的数据帧将自动添加反引号,使用第一列作为响应

> d <- data.frame(`25_dep`=1:5, predvar1=1:5, predvar2=1:5, `10_predvar3`=1:5, 
        check.names=FALSE) 
> formula(d) 
`25_dep` ~ predvar1 + predvar2 + `10_predvar3` 

该功能的代码(stats:::formula.data.frame)可以修改;它使用这样的as.name

> lhsOfFormula <- "25_dep" 
> rhsOfFormula <- c("predVar1", "predVar2", "10_predVar3") 
> ns <- sapply(c(lhsOfFormula, rhsOfFormula), as.name) 
> formula(paste(ns[1], paste(ns[-1], collapse="+"), sep=" ~ ")) 
`25_dep` ~ predVar1 + predVar2 + `10_predVar3` 
+1

'reconulate'也许? –

+0

@DWin:就是这样。尽管如此,它只能帮助回应。 – Aaron

+0

感谢Aaron,完美工作 – learner

相关问题