Как перебирать каталоги для обработки растровых файлов без цикла с семейством apply в R - PullRequest
0 голосов
/ 01 июля 2018

У меня есть растровые файлы (.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//")

1 Ответ

0 голосов
/ 01 июля 2018

Просто обобщите вашу обработку в определенную функцию с каталогом в качестве параметра, и все это будет вызываться с помощью lapply. В конце используйте do.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...