2

我对如何简化以下问题的代码进行了相当多的搜索,但没有成功。我认为使用某种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 中定义了弹性:liquidheatgdppciso3cparameters

  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但没有成功重新组合结果。由于我必须经常进行类似的计算,我将非常感谢任何帮助。

谢谢

4

1 回答 1

3

这是一种方法。注意我将您的parametersdata.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为“长”格式,其中solid、liquid、elec 和heat 四列中的值都在一个列中value,并且该列variable指示所指的指标value。现在,使用数据表,您可以轻松填写​​值。然后,使用dcast(...).

于 2014-01-22T17:52:41.413 回答