2012-02-28 38 views
3

我試圖「粘貼」一個公式,用於派對的暴徒功能。這意味着該公式將是y〜x1 + ... + xM |的形式Z1 + .. ZN。R:update.formula限制爲512個字符

我正在做一些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項)時都失敗。錯誤消息包含解析錯誤(文本= x)::1:514:意外')'

更改x變量名稱的長度將使用較少的變量來中斷update(),但始終引用僅超過512個字符的錯誤。

有沒有解決這個問題的方法?

謝謝。

+0

歡迎來到SO。 +1顯示示例代碼和一個明確的問題。 – Andrie 2012-02-28 13:33:58

回答

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) 
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="+"))) 
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=" | ")) 

感謝鄧肯默多克和r-幫助調查此事。