首页 > 解决方案 > 在 for 循环中使用 st_write 导出多个形状文件

问题描述

我正在尝试根据 FIREYEAR 中的唯一字段值创建多个 shapefile(和数据框)。我已经能够根据每年的正确数量的观察结果生成单独的数据框。使用 st_write 创建 shapefile 时,尽管它们输出不正确。我的代码创建了具有正确名称的单个 shapefile,但每个 shapefile 包含每年的所有值。在这种情况下,每个导出的 shapefile 应该有 2 个观察值,但从 1985 年的 4 个和 1986 年的 2 个出现。如何在我的 for 循环中实现 st_write 以正确导出多个形状文件?谢谢。

样本数据

df1 <- data.frame(FIRENAME = c("Gold", "Tree", "Tank", "Green_1"),
                  UNIQFIREID = c("1985-AZASF-000285", "1985-AZASF-000286", "1985-AZASF-000287", "1985-AZASF-000288"),
                  FIREYEAR = c("1985", "1985", "1986", "1986"),
                  TOTALACRES = c(60, 70, 80, 90))

# I left out the geometry which was sfc_MULTIPOLYGONs and didn't seem to make a difference for the example.

For 循环和 st_write 代码

for(i in unique(df1$FIREYEAR)) {
  list_data <- split(df1, df1$FIREYEAR)
  names(list_data) <- paste0("df_", names(list_data))
  list2env(list_data, .GlobalEnv)
  st_write(df1, dsn = "F:/School/NAU/Forestry/Masters/MSF_Project_2-7-2020/Michaels_Analysis/Fire_History/R", paste0(i), driver = "ESRI Shapefile", append = TRUE)
}

标签: rfor-loopshapefile

解决方案


for()您可能希望使用包iwalk()中的函数,而不是使用循环purrr。下面的代码将让您知道如何使用它来保存文件:

library(sf)
library(purrr)

df1 <- data.frame(FIRENAME = c("Gold", "Tree", "Tank", "Green_1"),
                  UNIQFIREID = c("1985-AZASF-000285", "1985-AZASF-000286", "1985-AZASF-000287", "1985-AZASF-000288"),
                  FIREYEAR = c("1985", "1985", "1986", "1986"),
                  TOTALACRES = c(60, 70, 80, 90))

list_data <- split(df1, df1$FIREYEAR)
names(list_data) <- paste0("df_", names(list_data))

iwalk(list_data, function(dat, name){
  st_write(obj = dat, dsn = paste0("path/to/file/", name, ".shp"))
})

推荐阅读