user950899
user950899

Reputation: 63

Creating formulas in R involving an arbitrary number of variables

I'm using the library poLCA. To use the main command of the library one has to create a formula as follows:

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

After this a command is invoked:

poLCA(f,data0,...)

V1, V2, V3 are the names of variables in the dataset data0. I'm running a simulation and I need to change the formula several times. Sometimes it has 3 variables, sometimes 4, sometimes more.

If I try something like:

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

it works fine. But then I have to know in advance how many variables I will use. I would like to define an arbitrary vector

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

and then create the formula as follows

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

Unfortunaly I get an error. I suspect the answer may involve some form of apply but I still don't understand very well how this functions work. Thanks in advance for any help.

Upvotes: 3

Views: 539

Answers (2)

Brian Diggs
Brian Diggs

Reputation: 58855

@DWin mentioned building the formula with paste and as.formula. I thought I'd show you what that would look like using the election dataset.

library("poLCA")
data(election)

vec <- c(1,3,4)

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

Upvotes: 2

joran
joran

Reputation: 173717

Using data from the examples in ?poLCA this (possibly hackish) idiom seems to work:

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

Edit

As Hadley points out in the comments, we're making this a bit more complicated than we need. In this case values is a data frame, not a matrix, so this:

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

generates an error, but this:

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

works fine. So you can just subset the columns as long as you wrap it in as.matrix.

Upvotes: 2

Related Questions