R摆脱嵌套的for循环
Posted
技术标签:
【中文标题】R摆脱嵌套的for循环【英文标题】:R getting rid of nested for loops 【发布时间】:2014-02-12 21:29:53 【问题描述】:我对如何简化以下问题的代码进行了相当多的搜索,但没有成功。我认为使用某种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
、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
让外部循环并行运行,但没有成功重新组合结果。由于我必须经常进行类似的计算,我将非常感谢任何帮助。
谢谢
【问题讨论】:
【参考方案1】:这是一种方法。请注意,我将您的 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
改造成“长”格式,其中solid、liquid、elec和heat这四列中的值都在一个列中,@987654326 @,variable
列表示value
指的是哪个指标。现在,使用数据表,您可以轻松填写值。然后,使用dcast(...)
将结果重新整形为宽格式。
【讨论】:
以上是关于R摆脱嵌套的for循环的主要内容,如果未能解决你的问题,请参考以下文章
使用 foreach 函数和 doParallel 库在 R 中嵌套 for 循环
R语言使用for循环嵌套ggplot2可视化输出多个可视化结果实战