循环遍历多个文件夹并计算相同文件夹R的栅格平均值

时间:2018-03-30 16:22:38

标签: r loops raster subdirectory batch-rename

我希望循环浏览R中父文件夹中的不同子文件夹。我确切地知道我是R的新用户。我有10个子文件夹位于1个父文件夹中。每个子文件夹包含100个栅格文件。 对于每个子文件夹,我想计算所有光栅文件的平均值,并根据子文件夹的名称编写新的栅格,并添加描述" mean"。

             |--Subfol i=1 --[raster(j=1), 
             |                 raster(j),    --mean 100 files -- Subfol1mean.        |
             |                raster(j=100)]
             |
parent_fold--|
             |
             |----Subfol i=1 --[raster(j=1),
                                raster(j),    --mean 100 files -- Subfol10mean.
                                raster(j=100)]

我尝试了以下代码:

 setwd("XXXX/parent_fold")
#list all the files in the subfolders
sub<- list.files(full.names = F , recursive =F, pattern='tiff')
for(j in 1:length(sub)){
h<- list.files(path=sub[j], recursive = T, full.names = T,    pattern='tiff')
d<-stack(h)
x<-stackApply(d, mean)
#writeRaster
}

我有一些困难要追求,我不确定我做了什么我是正确的道路。谢谢你的帮助。

我收到以下错误:

 Error in (function (classes, fdef, mtable)  : 
 unable to find an inherited method for function ‘nlayers’ for   signature ‘"matrix"’

2 个答案:

答案 0 :(得分:0)

根据您的描述,您希望首先遍历list.dirs寻找子文件夹,然后list.files寻找相应的文件。现在,您的循环将不会返回任何内容,因为 sub 将为空。考虑放置print语句进行验证。

sub <- list.dirs(full.names=FALSE, recursive=FALSE)

for(j in 1:length(sub)) {
  print(sub[j])

  h <- list.files(path=sub[j], recursive=TRUE, full.names=TRUE, pattern='.tiff')
  print(h)

  d <- stack(h)
  x <- stackApply(d, mean)

  writeRaster(x, filename=paste0(sub[j], "_mean.tiff"), format="****", overwrite=TRUE)
}

请根据需要调整最后一行,因为我对使用rasterfiles或 raster 包一无所知。文件将保存在父文件夹中。

答案 1 :(得分:0)

Below a solution that works well: 

setwd("XXX/parent_fold")
library(raster)
sub <- list.dirs(full.names=FALSE, recursive=FALSE)

for(j in 1:length(sub)) {
print(sub[j])

h <- list.files(path=sub[j], recursive=TRUE, full.names=TRUE,  pattern='.tiff')
print(h)

d <- stack(h)
mean <- stackApply(d, indices =  rep(1,nlayers(d)), fun = "mean", na.rm = T)

writeRaster(mean, filename=paste0(sub[j], "_mean.tif"), overwrite=TRUE)
}