R4.2.0循环读取嵌套文件夹TIFF 按场景年份匹配合并方法
R 4.2.0 批量配对合并嵌套文件夹TIF栅格实现方案
整体思路
不需要手动为每个场景、每个文件夹单独写遍历循环,先递归扫描根目录下所有符合规则的TIF文件,从文件名和路径中提取「场景编号、栅格类型、年份」三个匹配维度,自动完成同场景同年份的nested/highlevel文件配对,再批量调用你已经编写完成的单组合并函数即可。该逻辑支持自动识别新增场景,后续添加scenario3、scenario4时无需修改核心代码。
步骤1:加载依赖
首先安装、加载栅格处理所需的依赖包,terra是R4.2版本处理栅格的稳定兼容包:
# 首次运行时执行安装,已安装可注释掉 if (!require("terra")) install.packages("terra", version = "1.7-71") if (!require("dplyr")) install.packages("dplyr") # 加载包 library(terra) library(dplyr)
注:以下代码默认你已编写完成的单组合并函数名为
merge_tif_pair,支持传入两个TIF路径(或读取后的栅格对象)返回合并结果,你可以根据自己实际的函数名、参数形式调整对应代码。
步骤2:扫描文件建立匹配索引
将工作路径设置为存放scenario 1、scenario 2文件夹的根目录,递归扫描所有子文件夹下的TIF文件,生成带匹配标签的索引表:
# 替换为你本地的实际根目录路径 setwd("C:/your_project/raster_root/") # 递归遍历所有嵌套子文件夹,筛选全部TIF文件 all_tif <- list.files( pattern = "\\.tif$", recursive = TRUE, full.names = TRUE ) # 从路径中提取匹配字段,生成索引表 tif_index <- data.frame( full_path = all_tif, scenario = gsub(".*scenario\\s*(\\d+).*", "\\1", all_tif), # 提取场景编号 type = ifelse(grepl("highlevel", all_tif), "highlevel", "nested"), # 提取栅格类型 year = gsub(".*_(\\d{4})\\.tif$", "\\1", all_tif) # 提取年份 ) # 运行后可查看索引表确认字段提取是否正确 head(tif_index)
步骤3:批量配对执行合并
基于索引表自动匹配同场景、同年份的文件对,循环调用合并函数,支持自动保存结果、缺文件跳过提示:
# 提取所有需要处理的场景+年份组合 all_groups <- unique(tif_index[,c("scenario", "year")]) # 遍历所有组合执行合并 for(i in 1:nrow(all_groups)){ cur_scene <- all_groups$scenario[i] cur_year <- all_groups$year[i] # 匹配当前组合对应的两个文件路径 nested_p <- tif_index$full_path[tif_index$scenario == cur_scene & tif_index$year == cur_year & tif_index$type == "nested"] highlevel_p <- tif_index$full_path[tif_index$scenario == cur_scene & tif_index$year == cur_year & tif_index$type == "highlevel"] # 缺文件校验,避免循环中断 if(length(nested_p) != 1 | length(highlevel_p) !=1){ warning(paste0("场景", cur_scene, " 年份", cur_year, " 存在文件缺失,已跳过")) next } # 调用自定义合并函数 # 如果你的函数输入是文件路径,直接传参即可 merged_res <- merge_tif_pair(nested_path = nested_p, highlevel_path = highlevel_p) # 如果你的函数输入是读取后的栅格对象,替换为以下三行: # nested_rast <- rast(nested_p) # highlevel_rast <- rast(highlevel_p) # merged_res <- merge_tif_pair(nested_rast, highlevel_rast) # 自动保存合并结果,可自行调整输出路径规则 out_dir <- "merged_output" if(!dir.exists(out_dir)) dir.create(out_dir) out_path <- paste0(out_dir, "/scenario", cur_scene, "_merged_", cur_year, ".tif") writeRaster(merged_res, filename = out_path, overwrite = TRUE) print(paste0("已完成:场景", cur_scene, " 年份", cur_year)) }
注意事项
- R中路径不要使用单反斜杠
\,需替换为正斜杠/或双反斜杠\\,否则会报路径错误 - 如果你的文件命名规则有调整,只需要修改
gsub()部分的正则匹配规则即可,核心循环逻辑不需要改动 - 合并大体积TIF时建议适当分配内存,可在代码开头加
terraOptions(memfrac = 0.6)设置terra可用内存占比,避免内存不足报错
内容的提问来源于stack exchange,提问作者Francesca Chiappetta
相关产品推荐
相关产品推荐

