Инкрементный цикл в пакетах

Я надеялся, что кто-нибудь может помочь мне с функцией цикла, с которой я работаю. Я пытался много искать в Google и Stack Overflow, но, поскольку я не знаю точной терминологии поиска, я боюсь, что пропущу некоторые результаты. Имея это в виду, я заранее извиняюсь, если этот вопрос уже был задан, но я надеюсь, что кто-то может указать мне правильное направление для решения.

О моих данных

Я скачал тысячи файлов со спутника НАСА MODIS. Поскольку область моего исследования охватывает большую площадь, мне пришлось загружать данные по площади в 6 плиток. В результате мой список загруженных файлов фактически «сгруппирован» в группы по 6 (несмотря на то, что в проводнике он выглядит просто как список файлов).

Я написал несколько простых циклов for в R, чтобы выполнить некоторую начальную обработку (в приведенном ниже примере это повторная выборка плиток, чтобы их затем можно было сшить вместе с помощью raster::mosaic. На этом этапе эта обработка может выполняться для файлов по отдельности. поэтому я обнаружил, что приведенный ниже цикл идеально подходит для моих нужд:

resampled.raster<-list()

for (l in 1:24){
  cat(l,"\n")
  resampled.raster[[l]]<-resample(rst[[l]], s, method="ngb")
}

Проблема

Следующий этап моей обработки требует, чтобы я разбил растры на группы по 6, прежде чем перейти к следующему пакету из 6. Например, если у меня есть список из 24 файлов, первые 6 нужно будет обработать как набор файлы, а затем сохранены (в списке) перед переходом к следующим 6. После 4 итераций этого (чтобы всего было 24 файла) мне нужно, чтобы цикл остановился.

Самое близкое решение, которое я нашел в Интернете, находится здесь но это не решение моей проблемы.

Возможна ли эта «пакетная» обработка с использованием цикла for в R? Заранее большое спасибо за вашу помощь.


person Simon    schedule 26.07.2016    source источник
comment
Я никогда не использовал raster, но для выбора пакета вы можете сделать что-то вроде: step <- 6 с for(i in seq(1,24,step )), а затем внутри цикла batchIndex <- i:(i+step)   -  person StatMan    schedule 26.07.2016
comment
вы можете создать файл .txt со списком имен файлов, сгруппированных по партиям   -  person Adam    schedule 26.07.2016
comment
Спасибо вам обоим за комментарии. Приведенное ниже решение RobertH работает, и я принял этот ответ.   -  person Simon    schedule 26.07.2016


Ответы (1)


Во-первых, обратите внимание, что почти наверняка неправильно использовать resample и mosaic. Если это плитки, вы сможете использовать merge для их объединения.

Наверняка есть что-то уникальное в именах файлов, которые нужно сгруппировать? Это то, что вам нужно использовать.

Получить вектор с именами файлов

# ff <- list.files()

Вот игрушечный пример

ff <- c('fileA1', 'fileA2', 'fileB1', 'fileB2') 

Получите уникальные группы

code <- gsub('file', '', ff)
code <- substr(code, 1, 1)
uc <- unique(code)

Перебрать группы

for (u in uc) {
    files <- ff[u == code]
    r <- lapply(files, raster)
    r$filename <- paste0("merged/", u, ".tif")
    m <- do.call(merge, r)
}
person Robert Hijmans    schedule 26.07.2016
comment
Привет Роберт, большое спасибо за вашу помощь. Это действительно элегантное решение, и оно отлично сработало. Я все еще новичок в программировании, поэтому такой подробный ответ действительно помог мне понять, что происходит. Еще раз спасибо за ваше время. - person Simon; 26.07.2016
comment
На случай, если кто-то в будущем найдет это полезным, вот дополнительная информация. Как спрашивает RobertH, в именах файлов есть что-то уникальное. Каждый файл называется примерно так: MOD15A2.A2016169.h09v07.005.2016183085001 Используя описанный выше код Роберта, я удалил MOD15A2. и продолжил использовать следующие 8 символов в имени файла в качестве уникального идентификатора (в данном случае это A22016169). Поскольку мои данные охватывают 6 плиток по всему миру, есть шесть файлов, каждый из которых содержит A2016169. Это были 6 файлов, которые были объединены. - person Simon; 26.07.2016