我对如何简化以下问题的代码进行了相当多的搜索,但没有成功。我认为使用某种apply
-magic 可以加快速度,但到目前为止,我仍然对这些功能有困难....
我有一个 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
,但对于每个国家(编码中)。我在单独的 data.frame 中定义了弹性:liquid
heat
gdppc
iso3c
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
但没有成功重新组合结果。由于我必须经常进行类似的计算,我将非常感谢任何帮助。
谢谢