我想遍历包含世界形状文件的国家/地区名称列表,并创建每个国家/地区的各个shapefile。然后,我想对每个shapefile的栅格进行计算,并将结果强制转换为以国家/地区名称作为ID变量的数据框。
我已经为单个国家/地区成功编写了此代码,但正努力使其正确循环。
true
我要做的是从世界多边形shapefile中提取国家/地区名称列表,为该国家/地区创建一个单独的多边形,并将其循环到每个国家/地区。然后为每个具有国家/地区ID的国家/地区输出1个数据帧,并在其中添加“ var”。
编辑
到目前为止,这是我设法做到的,我真正想做的是向以下代码提供ID代码/名称列表以供循环。我当然可以手动复制并粘贴200多次,但这似乎浪费了时间!
liech.map <- world.polys[world.polys$NAME == "Liechtenstein",]
plot(liech.map)
rasters <- stack(raster_1, raster_2)
rasters.values <- extract(rasters, liech.map)
df <- as.data.frame(rasters.values)
var <- as.data.frame(weighted.mean(x=df$raster_1, w=df$raster_2, na.rm=TRUE))
答案 0 :(得分:1)
首先,我们创建一个要处理的列表。 world.polys
似乎是data.frame或类似数据,我们希望将其转换为命名列表。
polys_by_country <- split(world.polys, word.polys$ISO3)
接下来,我们将一个国家的代码重构为一个函数:
extract_raster_value <- function(country_map) {
# Here imagine country map is your LTU.mnap
rasters.values <- extract(rasters, country_map)
df <- as.data.frame(rasters.values)
# compute weighted mean and implicitly return it (last value of function)
weighted.mean(x=df$raster_1, w=df$raster_2, na.rm=TRUE)
}
好的,所以extract_raster_value会拍一张国家地图并返回一个数字,即加权平均值。请注意,无需使用rm
“清理”工作空间。该函数中定义的所有局部变量仅是函数作用域,不会污染全局环境。
您可以检查它是否有效。由于您没有提供可重复的示例,因此我必须假设是这样。
LTU.map <- world.polys[world.polys$ISO3 == "LTU",]
extract_raster_value(LTU.map)
下一步是将extract_raster_value应用于polys_by_country
的每个元素。
您可以使用基于R的apply
或lapply
函数,但我更喜欢使用purrr
包中的map系列函数。
library("purrr")
# Apply process_country to each element of the list and return the list of results
map(polys_by_country, process_country)
这将返回一个命名列表,其中名称是ISO3名称,值是您的加权平均值。
您可以使用以下方法而不是列表来获得结果:
result <- map_dbl(polys_by_country, process_country)
这完全避免了循环(或更确切地说,隐藏了循环)。
如果需要,您可以轻松地将结果转换为data.frame:
result_df <- data.frame(
country = names(result),
value = result
)
当然,根据world.polys
中的实际情况,可能会有更好的方法...通常,如果它是data.frame,则运行速度会更快:
library("dplyr")
world.polys %>%
group_by(ISO3) %>%
summarise(wm = weighted.mean(raster1, raster2))