2013-10-26 88 views
0

我想循環使用for循環的多個標題,以創建多個圖。我只是不知道通過我的頭變量時,進入我的for循環中,我做錯了什麼,因爲我不斷收到警告和錯誤從R.使用for循環來循環通過data.frame標題來創建多個圖 - R

下面是for循環,我使用:

dflist <- c('ABStemp', 'ABSelec', 'ABSheat') 

for (i in dflist) { 
    plot1<-contourplot(i ~ hour * weekday | month, 
       data = HourlyTotal, 
         cuts = 200, 
       labels=TRUE, 
       contour=FALSE, 
       drop.unused.levels = lattice.getOption("drop.unused.levels"), 
       region = TRUE, 
       pretty=FALSE, 
       xlab = "", 
       ylab = "Day of Week", 
       col.regions=colorRampPalette(c("blue","yellow","red")), 
       main = "Absolute Error (Temperature)", 
         layout=c(2,4), 
         as.table= TRUE) 

    plot2<-contourplot(i ~ hour * weekday, 
       aspect=0.3, 
       data = HourlyTotal, 
       cuts = 200, 
       #labels=TRUE, 
       contour=FALSE, 
       region = TRUE, 
       pretty=FALSE, 
       xlab = "Hour of Day", 
       ylab = "Day of Week", 
       col.regions=colorRampPalette(c("blue","yellow","red")) 
         ) 

    plot3<-contourplot(i ~ hour * month, 
       aspect=0.3, 
       data = HourlyTotal, 
       cuts = 200, 
       #labels=TRUE, 
       contour=FALSE, 
       region = TRUE, 
       pretty=FALSE, 
       xlab = "Hour of Day", 
       ylab = "Month of Year", 
       col.regions=colorRampPalette(c("blue","yellow","red")) 
         ) 

pdf(paste('Rplot',i,'.pdf'), width=8, height=12) 
print(plot1, more=TRUE) 
print(plot2, more=TRUE) 
print(plot3, more=FALSE) 
dev.off()  

} 

我已經嘗試了上面的衆多變體,但每次,i變量都無法正確傳遞到循環中,並且我在每個網格圖中都獲得了NA。

我正在使用的數據集可以在這裏找到:SummaryData。此外,我的完整代碼可在此處在線獲取:http://danielcoakley.com/projects/energy-simulation/

謝謝!

回答

1

您可以建立代表公式的字符串,然後使用as.formula函數創建formula對象。

as.formula(paste(i, "~ hour * weekday | month")) 
+0

是的,謝謝!這工作完美。我仍然在掌握R中的一些基礎知識,因此這裏的解決方案非常有幫助。再次感謝,我會在上面發佈我的代碼的最終版本。 –

0

的問題是,該字符串"ABStemp"不被解釋爲在數據幀的名稱。除了as.formula()解決方案之外,您還可以嘗試使用字符串引用良好的上下文。

在您致電contourplot時用HourlyTotal[,i]替換i。這適用於ggplot。不確定關於萊迪思。

+0

當我嘗試這樣做時,出現以下錯誤:[[.data.frame](HourlyTotal,,i):選擇了未定義列中的錯誤。將嘗試使用as.formula解決方案並很快回報:) –

1

感謝上面的@ zero323解決方案,下面的代碼現在完美地工作。

dflist <- c('ABStemp', 'ABSelec') 

for (i in dflist) { 
    plot1<-contourplot(as.formula(paste(i, "~ hour * weekday | month")), 
       data = HourlyTotal, 
         cuts = 200, 
       labels=TRUE, 
       contour=FALSE, 
       drop.unused.levels = lattice.getOption("drop.unused.levels"), 
       region = TRUE, 
       pretty=FALSE, 
       xlab = "", 
       ylab = "Day of Week", 
       col.regions=colorRampPalette(c("blue","yellow","red")), 
       main = "Absolute Error (Temperature)", 
         layout=c(2,4), 
         as.table= TRUE) 

    plot2<-contourplot(as.formula(paste(i, "~ hour * weekday")), 
       aspect=0.3, 
       data = HourlyTotal, 
       cuts = 200, 
       #labels=TRUE, 
       contour=FALSE, 
       region = TRUE, 
       pretty=FALSE, 
       xlab = "Hour of Day", 
       ylab = "Day of Week", 
       col.regions=colorRampPalette(c("blue","yellow","red")) 
         ) 

    plot3<-contourplot(as.formula(paste(i, "~ hour * month")), 
       aspect=0.3, 
       data = HourlyTotal, 
       cuts = 200, 
       #labels=TRUE, 
       contour=FALSE, 
       region = TRUE, 
       pretty=FALSE, 
       xlab = "Hour of Day", 
       ylab = "Month of Year", 
       col.regions=colorRampPalette(c("blue","yellow","red")) 
         ) 

    plot4<-contourplot(as.formula(paste(i, "~ Meas.DryBlb * hour")), 
       aspect=1, 
         contour=FALSE, 
         region = TRUE, 
       data = HourlyTotal, 
         ) 

    png(paste('Model\\Current Model\\Results\\',i,'.png'), width = 3600, height = 5000, units = "px", res = 400) 
    print(plot1, position = c(0,.5,1,1), more=TRUE) 
    print(plot2, position = c(0,.25,1,.5), more=TRUE) 
    print(plot3, position = c(0,0,1,.25), more=FALSE) 
    dev.off() 

}