如何基于文件名前缀自动批量堆叠文件夹中的栅格数据
解决方案
问题分析
原代码存在几处关键问题:
- 误用
char(files_base),正确获取字符串长度的函数是nchar() group_by仅完成分组标记,未对每组文件执行实际处理list.files的pattern参数传入向量会导致匹配逻辑混乱,无法精准筛选每组文件
修正后的实现步骤(基于terra包,栅格处理效率更高)
- 加载所需工具包
library(terra) library(dplyr)
- 获取所有栅格文件的完整路径
dir_years_raster <- file.path(dir_years, "raster") all_files <- list.files(path = dir_years_raster, pattern = "\\.tif$", full.names = TRUE)
- 提取每个文件的分组前缀(匹配末尾
_YYYY.tif格式,剥离年份和后缀保留核心前缀)
file_df <- data.frame(file_path = all_files) %>% mutate( file_name = basename(file_path), group_prefix = sub("_[0-9]{4}\\.tif$", "", file_name) )
- 按前缀分组,自动堆叠每组内的栅格文件
stacked_rasters <- file_df %>% group_by(group_prefix) %>% group_map(function(group_data, group_name) { # 堆叠当前组的所有栅格 rast_stack <- rast(group_data$file_path) # 给堆叠后的栅格命名,便于识别各年份图层 names(rast_stack) <- sub("\\.tif$", "", basename(group_data$file_path)) # 返回分组名称和对应堆叠结果 list(prefix = group_name, raster_stack = rast_stack) })
额外说明
stacked_rasters是一个列表,每个元素包含对应前缀的分组名称和堆叠完成的栅格对象- 如果需要直接保存堆叠后的栅格文件,可在
group_map中添加写入语句:
writeRaster(rast_stack, file.path(dir_years_raster, paste0(group_name, "_stacked.tif")), overwrite = TRUE)
原代码错误修正点
- 替换
char(files_base)为nchar(files_base) - 分组后需用
group_map/group_split执行组内操作,而非直接转为列表 list.files的pattern需针对单个分组前缀设置,通过循环或分组函数批量处理
内容的提问来源于stack exchange,提问作者Micheal
相关产品推荐
相关产品推荐

