Создание формул в R с произвольным числом переменных - PullRequest
3 голосов
/ 18 сентября 2011

Я использую библиотеку poLCA. Чтобы использовать основную команду библиотеки, нужно создать формулу следующим образом:

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]))

К сожалению, я получаю ошибку. Я подозреваю, что ответ может включать некоторую форму применения, но я все еще не очень хорошо понимаю, как работают эти функции. Заранее благодарен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

@ DWin упомянул построение формулы с paste и as.formula. Я подумал, что покажу вам, как это будет выглядеть, используя набор данных election.

library("poLCA")
data(election)

vec <- c(1,3,4)

f <- as.formula(paste("cbind(",paste(names(election)[vec],collapse=","),")~1",sep=""))
2 голосов
/ 18 сентября 2011

Используя данные из примеров в ?poLCA эта (возможно, хакерская) идиома, кажется, работает:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...