R:update.formula限制为512个字符

时间:2012-02-28 06:35:37

标签: r

我试图将一个公式“粘贴”在一起用于派对的暴民功能。这意味着公式的形式为y~x1 + ... + xM | Z1 + .. ZN。

我正在进行y~x1 + ... + xM的初步拟合,然后想要使用update()添加等式的条件部分。

这是测试代码:

var1 <- 1:78
x1 <- paste("x", var1, sep="")
f1 <- paste("f", var1[1:10], sep="")                                

# use first 77 variables
fmla <- as.formula( paste("y ~ ", paste(x1[1:77], collapse=" + ", sep=""), sep=""))
fmla2 <- update(fmla, paste(". ~ . | ", paste(f1, collapse= " + "), sep=""))

# CHANGE x to all 78 variables
fmla <- as.formula( paste("y ~ ", paste(x1, collapse=" + ", sep=""), sep=""))
fmla2 <- update(fmla, paste(". ~ . | ", paste(f1, collapse= " + "), sep=""))

我在Windows和Linux(64位)中运行它,并且在使用所有78个术语(以及超过78个术语)时都失败了。错误消息包含解析时出错(text = x):: 1:514:意外')'

更改x变量名称的长度将使用更少的变量来破坏update(),但总是会引用超过512个字符的错误。

有解决方法吗?

感谢。

3 个答案:

答案 0 :(得分:4)

由于这似乎是字符串长度问题,因此删除一些非必要字符很简单,例如加号周围的空格,即collapse= "+"

这有效:

fmla2 <- update(fmla, paste(". ~ . | ", paste(f1, collapse= "+"), sep=""))

fmla2
y ~ (x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30 + x31 + 
    x32 + x33 + x34 + x35 + x36 + x37 + x38 + x39 + x40 + x41 + 
    x42 + x43 + x44 + x45 + x46 + x47 + x48 + x49 + x50 + x51 + 
    x52 + x53 + x54 + x55 + x56 + x57 + x58 + x59 + x60 + x61 + 
    x62 + x63 + x64 + x65 + x66 + x67 + x68 + x69 + x70 + x71 + 
    x72 + x73 + x74 + x75 + x76 + x77 | f1 + f2 + f3 + f4 + f5 + 
    f6 + f7 + f8 + f9 + f10)

答案 1 :(得分:1)

感谢这些回复,但他们都错过了在公式上使用update()的重要部分。

我需要使用更新,因为第一个公式在粘贴公式的条件部分之前会自行更新。

不能在公式上使用as.character(),因为as.character()的约束限为~500。解决这个问题的一种方法是在第一个公式完成后使用deparse()。

fmla.string <- gsub(" ","",paste(deparse(fmla), collapse=""), fixed=T)
fmla2 <- as.formula( paste(fmla.string, paste(f1, collapse= " + "), sep=" | "))

感谢Duncan Murdoch和r-help对此进行调查。

答案 2 :(得分:0)

这是解决方法。

var1 <- 1:78
x1 <- paste("x", var1, sep="")
f1 <- paste("f", var1[1:10], sep="")
as.formula(paste("y~",paste(x1,collapse="+"),"|",paste(f1,collapse="+")))