2013-07-28 92 views
3

我是新來的循環,我有一個從第i個數據框調用變量的問題。對於i循環,調用不同的數據框

我能夠正確地調用每個數據幀,但是當我應該叫每個數據幀的問題裏面指定的變量來:

例子:

for (i in 1:15) { 
    assign(
     paste("model", i, sep = ""), 
    (lm(response ~ variable, data = eval(parse(text = paste("data", i, sep = ""))))) 
    ) 
    plot(data[i]$response, predict.lm(eval(parse(text = paste("model", i, sep = ""))))) #plot obs vs preds 
} 

在這裏我做一個簡單的一個可變線性模型15次,工作得很好。當我嘗試繪製結果時出現問題。我應該如何撥打data[i]迴應?

+4

爲什麼使用'assign'和'eval'?您可以使用列表來存儲所有數據集。 –

+1

如果你是初學者,並且發現自己使用'assign','eval'或'parse',那麼在R中有更好的方法來做這件事的可能性非常高。正如@VincentZoonekynd指出的那樣,使用名單。 – Roland

+0

你有這種循環結構的鏈接嗎?我試圖找到一些,但我不知道他們是我在找什麼。每個數據集(n = 15)有68個變量和284個obs。我也想改變我所調用的變量。任何幫助表示讚賞。 – reima

回答

1

假設有多個名稱爲data1 ... data15的數據框,並且沒有以字母:d,a,t,a開頭的其他數據對象。我們還假定在每個數據框中都有名爲'response'和'variable'的列。這將收集數據框到列表中,併爲線性迴歸線繪製單獨的圖。

dlist <- lapply (ls(patt='^data'), get) 
lapply(dlist, function(df) 
       plot(NA, xlim=range(df$variable), ylim=range(df$response) 
       abline(coef(lm(response ~ variable, data=df))) 
     ) 

如果您想名字在該名單上dataframes,你可以用你的粘貼代碼提供名稱:

names(dlist) <- paste("data", i, sep = "") 

有你能在這個循環的背景下許多其他任務,但你需要比失敗的努力更好地描述所需的結果。

0

這裏是應該工作的修改代碼。它執行一個變量lm模型並計算預測值和觀測值的相關性並將其存儲到空矩陣中。它也繪製這些值。
謝謝托馬斯的幫助。

par(mfrow=c(4,5)) 
results.matrix <- matrix(NA, nrow = 20, ncol = 2) 
colnames(results.matrix) <- c("Subset","Correlation") 

for (i in 1:length(datalist)) { 
    model <- lm(response ~ variable, data = datalist[[i]]) 
    pred <- predict.lm(model) 
    cor <- (cor.test(pred, datalist[[i]]$response)) 
    plot(pred, datalist[[i]]$response, xlab="pred", ylab="obs") 
    results.matrix[i, 1] <- i 
    results.matrix[i, 2] <- cor$estimate 
} 
+0

「for(i in datalist)'應該爲for :長度(數據列表))'。 – Thomas

+0

'model < - lm(response_variable,data = i)'應該是'model < - lm(response_variable,data = datalist [[i]])''。 – Thomas

+0

'cor < - (cor.test(pred,i $ response)'應該是'cor < - (cor.test(pred,datalist [[i]] $ response)') – Thomas