2014-01-22 159 views
2

我做了相當多的搜索如何簡化下面的問題的代碼,但沒有成功。我認爲有某種apply -Magic一個可以加快速度了一點,但到目前爲止,我仍然有我的苦衷與這些樣的功能....R擺脫嵌套for循環

我有一個data.frame data,結構如下:

year iso3c gdpppc elec solid liquid heat 
2010 USA 1567 1063 1118 835 616 
2015 USA 1571  NA NA NA  NA 
2020 USA 1579  NA NA NA  NA 
... USA  ...  NA NA NA  NA 
2100 USA 3568  NA NA NA  NA 
2010 ARG  256 145 91 85  37 
2015 ARG  261  NA NA NA  NA 
2020 ARG  270  NA NA NA  NA 
... ARG  ...  NA NA NA  NA 
2100 ARG  632  NA NA NA  NA 

正如你所看到的,我有2010和歷史起點值gdppc高達2100我想讓值elecsolidliquidheat一個完整的情景成長根據一些與彈性尊重gdppc的發展,但分別爲每個國家(編碼在iso3c)。 我有一個單獨的data.frame parameters限定的彈性:

item value 
    elec 0.5 
liquid 0.2 
solid -0.1 
    heat 0.1 

到目前爲止我使用嵌套for循環:

for (e in 1:length(levels(parameters$item)){ 
    for (c in 1:length(levels(data$iso3c)){ 
    tmp <- subset(data, select=c("year", "iso3c", "gdppc", parameters[e, "item"]), subset=("iso3c" == levels(data$iso3c)[c])) 

    tmp[tmp$year %in% seq(2015, 2100, 5), parameters[e, "item"]] <- 
     tmp[tmp$year == 2010, parameters[e, "item"]] * 
     cumprod((1 + (tmp[tmp$year %in% seq(2015, 2100, 5), "gdppc"]/
     tmp[tmp$year %in% seq(2010, 2095, 5), "gdppc"] - 1) * parameters[e, "value"])) 

    data[data$iso3c == levels(data$iso3c)[i] & data$year %in% seq(2015, 2100, 5), parameters[e, "item"]] <- tmp[tmp$year > 2010, parameters[e, "item"]] 

    } 
} 

外環循環通過柱和內一個以上那些國家。內部循環爲每個國家運行(我有180多個國家)。首先,選擇一個包含單個國家和感興趣變量數據的子集。然後我讓相應的變量在gdppc中以一定的彈性增長到增長,並最終將這個子集放回data。 我已經嘗試讓外環使用foreach並行運行,但沒有成功重組結果。由於我必須經常進行類似的計算,所以我會非常感謝任何幫助。

謝謝

回答

3

這是一種方法。注意:我改名爲你parameters data.frame到p

library(data.table) 
library(reshape2) 

dt <- data.table(data) 
dt.melt = melt(dt,id=1:3) 
dt.melt[,value:=as.numeric(value)] # coerce value column to numeric 
dt.melt[,value:=head(value,1)+(gdpppc-head(gdpppc,1))*p[p$item==variable,]$value, 
     by="iso3c,variable"] 
result <- dcast(dt.melt,iso3c+year+gdpppc~variable) 
result 
# iso3c year gdpppc elec solid liquid heat 
# 1 ARG 2010 256 145.0 91.0 85.0 37.0 
# 2 ARG 2015 261 147.5 90.5 86.0 37.5 
# 3 ARG 2020 270 152.0 89.6 87.8 38.4 
# 4 ARG 2100 632 333.0 53.4 160.2 74.6 
# 5 USA 2010 1567 1063.0 1118.0 835.0 616.0 
# 6 USA 2015 1571 1065.0 1117.6 835.8 616.4 
# 7 USA 2020 1579 1069.0 1116.8 837.4 617.2 
# 8 USA 2100 3568 2063.5 917.9 1235.2 816.1 

的基本思想是使用melt(...)功能重塑你原來data爲「長」格式,其中在四列固體,液體中的值,ELEC,並且熱量全部在一列中,value,並且列variable指示哪個度量value涉及。現在,使用數據表,您可以輕鬆填寫​​值。然後,使用dcast(...)將結果重新整理爲寬格式。