在R中创建涉及任意数量变量的公式

3
我是使用 poLCA 库。为了使用此库的主命令,您需要按照以下方式创建一个公式:
f <- cbind(V1,V2,V3)~1

接下来会调用一个命令:

poLCA(f,data0,...)

V1、V2和V3是数据集data0中变量的名称。我正在运行一个模拟,需要多次更改公式。有时它有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

使用来自?poLCA示例的数据,这个(可能有些hackish)习惯用法似乎可行:

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

编辑

正如Hadley在评论中指出的那样,我们把这个问题搞得比必要的还要复杂。在这种情况下,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中,你就可以对列进行子集处理。


使用 do.call 没有任何问题。它是一个很棒的解释工具,与 as.name 和类似的函数一起使用效果更佳。 - Carl Witthoft
我明白为什么它看起来像是hackish,但使用paste操作和as.formula构建公式的另一种方式也很hackish。 - IRTFM
不明白为什么需要在这里使用 do.call。为什么子集赋值不能给你一个矩阵? - hadley
非常感谢大家。问题已解决。我在一个周六晚上很晚才发布了我的问题,但是到了周日早上我就得到了答案。Stackoverflow.com真的太棒了,不是吗? :-) - user950899
如果任何一个答案解决了你的问题,请点击你偏爱的那个旁边的勾选标记,这样其他查看此问题的人就会知道你已经得到了可行的解决方案。 - joran

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接