如何使用矢量值作为R中的变量

问题描述:

我有一个名为repay的数据框,并且我为变量名称创建了一个我感兴趣的变量名称的变量。如何使用矢量值作为R中的变量

variables<-names(repay)[22:36] 

我想写一个for循环,对变量中的每个变量做一些单变量分析。例如:

for (i in 1:length(variables)) 
{ 
model<-glm(Successful~ variables[i] 
,data=repay 
,family=binomial(link='logit')) 
} 

然而,它不能识别variables[i]作为变量,给以下错误消息:

错误model.frame.default(式=成功〜变量[I]中,数据 =偿还,:可变长度不同(发现 '变量[I]')

你可以从字符串创建语言对象,

var = "cyl" 
lm(as.formula(sprintf("mpg ~ %s", var)), data=mtcars) 
# alternative (see also substitute) 
lm(bquote(mpg~.(as.name(var))), data=mtcars) 
+0

也许'reconulate'会更直接。 – lmo

或者,您可以使用assign产生与变量一样多的模型。 让我们考虑

repay<-data.table(Successful=runif(10),a=sample(10),b=sample(10),c=runif(10)) 
variables<-names(repay)[2:4] 

产生:

>repay 
    Successful a b   c 
1: 0.8457686 7 9 0.2930537 
2: 0.4050198 6 6 0.5948573 
3: 0.1994583 2 8 0.4198423 
4: 0.1471735 1 5 0.5906494 
5: 0.7765083 8 10 0.7933327 
6: 0.6503692 9 4 0.4262896 
7: 0.2449512 4 1 0.7311928 
8: 0.6754966 3 3 0.4723299 
9: 0.7792951 10 7 0.9101495 
10: 0.6281890 5 2 0.9215107 

然后就可以进行循环

for (i in 1:length(variables)){ assign(paste0("model",i),eval(parse(text=paste("glm(Successful~",variables[i],",data=repay,family=binomial(link='logit'))")))) }

导致3个对象:model1model2model3

>model1 
Call: glm(formula = Successful ~ a, family = binomial(link = "logit"), 
data = repay) 
Coefficients: 
(Intercept)   a 
    -0.36770  0.05501 
Degrees of Freedom: 9 Total (i.e. Null); 8 Residual 
Null Deviance:  5.752 
Residual Deviance: 5.69 AIC: 17.66 

同上为model2model3 et.c.

小的解决方法,可以帮助

for (i in 22:36) 
{ 
    ivar <- repay[i] #choose variable for running the model 
    repay2 <- data.frame(Successful= repay$Successful, ivar) #create new data frame with 2 variables only for running the model 

    #run model for new data frame repay2 
    model<-glm(Successful~ ivar 
      ,data=repay2 
      ,family=binomial(link='logit')) 
} 
+0

不应''我跑'1:长度(变量)',因此'对于(我在1:长度(变量)){...}' – amonk

+0

谢谢@agerom!应该在这个地方使用'repay'变量。 – AK47

+0

所以现在你不需要'variables amonk

尝试使用formula功能R.它可以让模型正确的解释如下:

for (i in 1:length(variables){ 
    myglm <- glm(formula(paste("Successful", "~", variables[i])), 
       data = repay, family = binomial(link = 'logit')) 

更多的东西,你可以在做见my post here这个背景。