我做了相當多的搜索如何簡化下面的問題的代碼,但沒有成功。我認爲有某種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我想讓值elec
,solid
,liquid
和heat
一個完整的情景成長根據一些與彈性尊重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
並行運行,但沒有成功重組結果。由於我必須經常進行類似的計算,所以我會非常感謝任何幫助。
謝謝