R摆脱嵌套的for循环

时间:2014-01-22 17:10:28

标签: r dataframe elasticity

我做了很多关于如何简化下面问题的代码的搜索,但没有成功。我假设有某种apply - 魔术可以加速一点,但到目前为止,我仍然遇到这些功能的困难....

我有一个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年的完整方案。我想让elecsolid,{{ 1}}和liquid根据heat的发展弹性增长,但每个国家/地区(gdppc编码)分别增长。  我在单独的data.frame iso3c

中定义了弹性
parameters

到目前为止,我使用的是嵌套的 item value elec 0.5 liquid 0.2 solid -0.1 heat 0.1 循环:

for

外部循环遍布列,而内部循环遍布各个国家/地区。内循环适用于每个国家(我有180多个国家)。首先,选择包含关于一个国家和关注变量的数据的子集。然后我让相应的变量以一定的弹性增长到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"]] } } 中的增长,最后将子集放回gdppc中的位置。 我已经尝试使用data让外循环并行运行但是没有成功重组结果。由于我必须经常进行类似的计算,所以我将非常感谢您的帮助。

由于

1 个答案:

答案 0 :(得分: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重新整形为“long”格式,其中四列中的值solid,liquid,elec和heat都在一个列value和列variable表示value指的是哪个指标。现在,使用数据表,您可以轻松填写​​值。然后,使用dcast(...)将结果重新整形为宽格式。