我试图将一个公式“粘贴”在一起用于派对的暴民功能。这意味着公式的形式为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个字符的错误。
有解决方法吗?
感谢。
答案 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="+")))