如何读取多个文件夹下的同名shapefile并关联文件夹名作为ID
问题排查与修复方案
现有代码的核心错误点
list.dirs默认会返回根目录./locs自身,同时会递归遍历所有子文件夹,其中很可能包含没有对应shapefile的文件夹,导致读取失败readOGR的layer参数不需要加.shp后缀,只需要传入文件的主名即可,你写的"SAMENAME.shp"会导致识别不到图层try是R内置的函数名,用它作为变量名会覆盖原有函数,建议更换为其他变量名
修复后的基础版本代码
library(rgdal) library(purrr) # 读取文件夹列表,可根据需要调整recursive参数 folders <- list.dirs(path = "./locs", full.names = TRUE, recursive = TRUE) # 过滤掉根目录(根目录下没有对应shp的情况下可保留该逻辑) folders <- folders[folders != "./locs"] # 修正读取函数,layer去掉.shp后缀,同时实现文件夹名关联ID的需求 read_shp <- function(folder) { shp <- readOGR(dsn = folder, layer = "SAMENAME", verbose = FALSE) # 把所属文件夹名作为ID写入属性表 shp$folder_id <- basename(folder) return(shp) } # 映射读取,用safely避免单个文件读取失败导致整个流程中断 shp_list <- map(folders, safely(read_shp)) # 筛选读取成功的结果 success_idx <- map_lgl(shp_list, ~is.null(.x$error)) final_shps <- map(shp_list[success_idx], ~.x$result)
更推荐的优化方案
改用sf包读取矢量数据,语法更简洁,和tidyverse生态兼容性更好,可直接输出合并后的数据集:
library(sf) library(purrr) library(dplyr) folders <- list.dirs("./locs", full.names = TRUE, recursive = TRUE) folders <- folders[folders != "./locs"] # 构造所有shp文件的完整路径 shp_paths <- file.path(folders, "SAMENAME.shp") # 批量读取、添加文件夹ID、直接合并为单一sf对象 final_shps <- map_dfr(shp_paths, function(path) { st_read(path, quiet = TRUE) %>% mutate(folder_id = basename(dirname(path))) })
内容的提问来源于stack exchange,提问作者Nazer
相关产品推荐
相关产品推荐

