使用R中的非常长的字符串创建公式

时间:2015-04-10 07:13:48

标签: r formula

我的情况是,我的数据框中有一个非常大的数据框的列名。

我们假设:x = c("Name", "address", "Gender", ......, "class" ) [大约100个变量]

现在,我想创建一个我最终用来创建HoeffdingTree的公式。 我正在使用以下方法创建公式:

myformula <- as.formula(paste("class ~ ", paste(x, collapse= "+")))

这会引发以下错误:

  

解析时出错(text = x):: 1:360:意外'其他'   1:E +蔓延+ prayforsonni +只是+需要+功放+争辩+ blxcknicotine +心情+现在+右+实际上+ herapatra +一定+简单+吸+有+总是+饼干+有史以来+家居+让+漂亮+黑人+它们+倍+阿布+ +所有alliepickl

上述语句中的paste部分工作正常,但将其作为参数传递给as.formula会引发各种奇怪的问题。

3 个答案:

答案 0 :(得分:9)

问题是你有R关键字作为列名。 else是一个关键字,因此您无法将其用作常规名称。

简化示例:

s <- c("x", "else", "z")
f <- paste("y~", paste(s, collapse="+"))
formula(f)
# Error in parse(text = x) : <text>:1:10: unexpected '+'
# 1: y~ x+else+
#              ^

解决方案是用反引号“`”包装你的单词,以便R将它们视为非语法变量名。

f <- paste("y~", paste(sprintf("`%s`", s), collapse="+"))
formula(f)
# y ~ x + `else` + z

答案 1 :(得分:2)

您可以先减少数据集

dat_small <- dat[,c("class",x)]

然后使用

myformula <- as.formula("class ~ .")

.表示使用所有其他(除了类)之外的所有列。

答案 2 :(得分:1)

您可以尝试reformulate

 reformulate(setdiff(x, 'class'), response='class')
 #class ~ Name + address + Gender

其中'x'是

  x <- c("Name", "address", "Gender", 'class')

如果R关键字在'x'中,则可以

   reformulate('.', response='class')
   #class ~ .