2017-06-06 94 views
1

我有一個名爲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]')

回答

0

你可以從字符串創建語言對象,

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

0

或者,您可以使用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.

0

小的解決方法,可以幫助

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 <-names(repay)[22:36]',對嗎? – amonk

0

嘗試使用formula功能R.它可以讓模型正確的解釋如下:

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

更多的東西,你可以在做見my post here這個背景。