首页 > 解决方案 > 如何遍历目录以处理光栅文件而不使用 R 中的应用系列

问题描述

我在不同的文件夹中有光栅文件(.tif)(这些是我的模型)。我需要将它们导入单个对象并处理它们以创建一个数组(为此我将使用“abind”)。

我确实有大量模型,因此创建了一个巨大的数组数据集。我设法创建了一个用于一次读取和处理模型的函数。问题是,由于数据集的复杂性,在 for 循环中增长数组可能不是一个好主意,这可能会导致一些错误。

如何利用apply R的家庭功能为它构建一个功能?

这是我制作的功能

require(raster)
require(abind)
require(rgdal)

myFunction <- function (x)
{
  directories <- list.dirs( x, full.names = TRUE)[-1]
  e <- extent(xmin, xmax, ymin, ymax)
  rcp <- NULL
  
  for (i in 1:length(directories))
  {
    models_raw <- stack(list.files(directories[i],pattern = ".tif$", full.names = TRUE))
    models_e <- crop( models_raw , e ) 
    val <- values (models_e)
    coord <- xyFromCell(models_e, 1:ncell(models_e))
    models <- cbind(coord, val)
    models <- na.omit(models)
    rcp <- abind (rcp, models, along = 3)
  }

  return(rcp) 
} 

scenario <- myFunction( x = ".//data//models//")

标签: r

解决方案


只需将您的处理概括为一个以目录为参数的已定义函数,所有这些都将使用lapply. 最后使用 ado.call来组合所有模型。不需要单独的对象。

model_process <- function(dir) {
  model <- stack(list.files(dir,  pattern = ".tif$", full.names = TRUE))
  e <- extent(xmin, xmax, ymin, ymax)
  model_e <- crop(model, e)
  model_val <- getValues(model_e)
  coord_model <- xyFromCell(model_e, 1:ncell(model_e)) 
  model_final <- cbind(coord_model, model_val)
  model_final <- na.omit(model_final)

  return(model_final)
}

directories <- list.dirs(".//data//models//", full.names = TRUE)[-1]

model_list <- lapply(directories, model_process)

scenario <- do.call(abind, c(model_list, along=3))

# ALTERNATIVELY:
apn <- function(...) abind(..., along=3)
scenario <- do.call("apn", model_list)

推荐阅读