r - 在 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)
}
解决方案
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"))
})
推荐阅读
- windows-server-2012 - 在 windows server 2016 中是否兼容 Visual source safe 2005
- mobile - wso2 安装按钮在移动应用程序管理上不起作用
- python - 如何设置文件缓冲参数?
- javascript - 尝试在 React 中将新元素添加到数组状态时出错
- javascript - 如何在不同的组中匹配 X 个完整的单词?
- xamarin.forms - 框架未采用全高 Xamarin 形式
- reactjs - reactJs中的数组操作
- node.js - Nodejs JavaScript,检查两种不同的日期格式是否在 24 小时内
- javascript - 清理任务后 Gulp EN0ENT 丢失目录错误?
- python - AttributeError:“NoneType”对象没有属性“文本”?