通过列表创建循环并将输出添加到数据框

时间:2019-06-10 13:51:56

标签: r dataframe polygon raster

我想遍历包含世界形状文件的国家/地区名称列表,并创建每个国家/地区的各个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))

1 个答案:

答案 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的applylapply函数,但我更喜欢使用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))