2011-09-18 58 views
3

我正在使用庫poLCA。使用該庫之一的主命令具有如下創建公式:在R中創建涉及任意數量變量的公式

f <- cbind(V1,V2,V3)~1 

該命令被調用後:

poLCA(f,data0,...) 

V1,V2,V3是變量中的名稱數據集數據0。我正在運行模擬,我需要多次更改公式。有時它有3個變量,有時是4個,有時更多。

如果我嘗試類似:

f <- cbind(get(names(data0)[1]),get(names(data0)[2]),get(names(data0)[3]))~1 

它工作正常。但是,我必須事先知道我將使用多少變量。我想定義任意矢量

vars0 <- c(1,5,17,21) 

,然後創建公式如下

f<- cbind(get(names(data0)[var0])) 

Unfortunaly我得到一個錯誤。我懷疑答案可能涉及某種形式的適用,但我仍然不太清楚這個函數的工作原理。預先感謝您的幫助。

回答

2

?poLCA使用來自實例數據本(可能的hackish)成語似乎工作:

library(poLCA) 
vec <- c(1,3,4) 
M4 <- poLCA(do.call(cbind,values[,vec])~1,values,nclass = 1) 

編輯

正如哈德利在評論中指出的,我們正在做這一點比我們需要的更復雜。在這種情況下values是一個數據幀,而不是一個矩陣,所以這樣的:

M1 <- poLCA(values[,c(1,2,4)]~1,values,nclass = 1) 

產生一個錯誤,但這:

M1 <- poLCA(as.matrix(values[,c(1,2,4)])~1,values,nclass = 1) 

工作正常。因此,只要將其包裝在as.matrix中,您就可以對列進行分組。

+0

使用do.call沒有任何問題。這是一個很好的解釋工具,以及as.name和類似的功能。 –

+0

我明白爲什麼它看起來很駭人,但用'paste'操作和'as.formula'構建公式的另一種方式看起來也很駭人聽聞。 –

+0

看不出你爲什麼需要這樣做。爲什麼不將子集值賦給你一個矩陣? – hadley

2

@DWin提到用pasteas.formula構建公式。我想我會告訴你使用election數據集的樣子。

library("poLCA") 
data(election) 

vec <- c(1,3,4) 

f <- as.formula(paste("cbind(",paste(names(election)[vec],collapse=","),")~1",sep="")) 
+0

謝謝Brian。這也起作用。 – user950899