如何在R中重命名子文件夹多文件并保留原路径及实现植被指数计算
R语言批量重命名栅格文件并计算NDVI解决方案
问题背景
现有9个子文件夹,每个文件夹内包含3个对应单幅影像的栅格波段文件(文件名含颗粒ID、卫星类型等信息),需要:
- 将每个文件夹内的3个文件统一重命名为
red.tiff、nir.tiff、fmask.tiff,且保留在原文件夹中 - 基于重命名后的文件计算NDVI,结果保存至对应子文件夹
一、批量重命名(保留原路径)
原代码问题:使用list.files(..., full.names = FALSE)仅获取文件名,导致重命名时文件被移动到工作目录。以下代码遍历每个子文件夹,匹配对应波段并在原路径下重命名:
# 设置主目录路径 fieldszn <- '~/Desktop/hls project/fieldszn' # 获取所有子文件夹的完整路径 subfolders <- list.dirs(fieldszn, recursive = FALSE) # 遍历每个子文件夹 for (folder in subfolders) { # 获取当前文件夹下所有.tiff文件(带完整路径) band_files <- list.files(folder, pattern = "\\.tiff$", full.names = TRUE) # 根据实际文件名匹配对应波段(需根据你的文件名规则调整关键词) # 示例:假设红波段文件名含"red"/"B4",近红外含"nir"/"B5",fmask含"fmask"/"QA" red_file <- grep("red|RED|B4", band_files, value = TRUE) nir_file <- grep("nir|NIR|B5", band_files, value = TRUE) fmask_file <- grep("fmask|FMASK|QA", band_files, value = TRUE) # 在原文件夹内重命名文件 file.rename(red_file, file.path(folder, "red.tiff")) file.rename(nir_file, file.path(folder, "nir.tiff")) file.rename(fmask_file, file.path(folder, "fmask.tiff")) }
关键说明
file.path()用于拼接文件夹路径和新文件名,确保文件保留在原目录- 正则匹配规则需根据你的实际文件名调整,保证每个波段能被准确识别
二、遍历计算NDVI并保存
使用raster包读取栅格、计算NDVI,结果保存至对应子文件夹:
# 安装并加载raster包(首次运行需安装) # install.packages("raster") library(raster) # 遍历子文件夹计算NDVI for (folder in subfolders) { # 读取当前文件夹下的红波段和近红外波段 red <- raster(file.path(folder, "red.tiff")) nir <- raster(file.path(folder, "nir.tiff")) # 计算NDVI ndvi <- (nir - red) / (nir + red) # 保存NDVI结果到当前文件夹,文件名包含子文件夹名称 output_name <- paste0("NDVI_", basename(folder), ".tif") writeRaster(ndvi, file.path(folder, output_name), format = "GTiff", overwrite = TRUE) }
关键说明
overwrite = TRUE允许重复运行时覆盖已存在的NDVI文件- 若需处理多幅影像堆叠计算,可调整代码使用
stack()读取同波段的所有文件,但当前场景下每个子文件夹对应单幅影像,单文件读取更合适
内容的提问来源于stack exchange,提问作者codenoob
相关产品推荐
相关产品推荐

