2012-08-02 43 views
4

我需要創建一個對象來計算和存儲過去兩年中每年的每個月的網格中14個節點的3套電力價格(高峯期,非高峯期和一天平均值) 。我認爲嵌入式列表數據結構將是適當的(糾正我,如果這不是最佳的)。任何清潔/優雅的方式來創建列表的列表,而不使用'for'構造?

在任何情況下,我不喜歡使用for循環來創建此結構。如果有一個優雅的方式來做到這一點,我會很感激,如果有人可以幫助引導我在正確的方向。我正在努力練習和改進我的編碼。謝謝。

hb_lz_names <- c("HB_BUSAVG", "HB_HOUSTON", "HB_HUBAVG", "HB_NORTH", "HB_SOUTH", 
"HB_WEST", "LZ_AEN", "LZ_CPS", "LZ_HOUSTON", "LZ_LCRA", "LZ_NORTH", 
"LZ_RAYBN", "LZ_SOUTH", "LZ_WEST") 

power_price <- list() 
for (i in 1:2){ 
    power_price[[i]] <- list() 
    for (j in 1:12){ 
    power_price[[i]][[j]] <- list() 
    for (k in 1:NROW(hb_lz_names)) { 
     power_price[[i]][[j]][[k]] <- list() 
     for (l in 1:3){ 
     power_price[[i]][[j]][[k]][[l]] <- l 
     } 
     names(power_price[[i]][[j]][[k]]) <- c("on-peak", "off-peak", "average") 
    } 
    names(power_price[[i]][[j]]) <- hb_lz_names 
    } 
    names(power_price[[i]]) <- c("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", 
          "sep", "oct", "nov", "dec") 
} 
names(power_price) <- c("2011", "2012") 
+1

如何使用'expand.grid'? – mnel 2012-08-02 02:22:08

回答

5

我認爲,設置這樣的定期(不是衣衫襤褸)的數據,你會更好使用數組:

period_names <- c("on-peak", "off-peak", "average") 
hb_lz_names <- c("HB_BUSAVG", "HB_HOUSTON", "HB_HUBAVG", "HB_NORTH", "HB_SOUTH", 
"HB_WEST", "LZ_AEN", "LZ_CPS", "LZ_HOUSTON", "LZ_LCRA", "LZ_NORTH", 
"LZ_RAYBN", "LZ_SOUTH", "LZ_WEST") 
yrs <- 2011:2012 

power.price <- array(1,dim=c(2,12,length(hb_lz_names),length(period_names))) 
dimnames(power.price) <- list(year=yrs,month=month.abb,node=hb_lz_names, 
           period=period_names) 

(給名,在元素dimnames列表中 - 即命名您的尺寸 - 可以在嘗試記住陣列結構時有很大的幫助...)

然後,您可以使用apply輕鬆計算跨越相應邊距的平均值(或其他彙總統計數據),並使用reshape2::melt將長格式轉換爲長格式(對於ggplot圖形或統計分析)......根據我的經驗,深度嵌套列表是一種痛苦屁股。

+1

+1擊敗我! – mnel 2012-08-02 02:27:42

+0

非常感謝您的指導。我實際上會使用ggplot,並將進行一些統計分析,所以這是很好的信息。謝謝@mnel你的建議。 – codingknob 2012-08-02 04:11:02

相關問題