R - чтение и затем извлечение той же ячейки из списка бинарных файлов IMG - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь извлечь значения одной и той же ячейки [i, j] из ~ 14000 файлов img. Я настроил рабочую функцию, которая делала это для небольших партий, где было разумно поместить файлы в мой каталог, но теперь, когда я готов взглянуть на больший набор данных, я застрял. IMG файлы организованы по годам, с 365 отдельными файлами для каждой из 38 зим. Каждая зима имеет свою собственную папку (WS1978_1979data, WS1979_1980data и т. Д.), И каждый день имеет свой собственный файл, содержащий данные о глубине снега для большой спутниковой сетки в Арктике (ssmi_n_snowdepth_5day_1978307.img, ssmi_n_snowdepth_5day_1978308.img и т. Д.), Начиная с октября до 30 сентября следующего года. Моя последняя надежда (по крайней мере, на этом этапе) - создать вектор из 365 глубин снега для интересующей ячейки и делать это для каждого года в наборе данных.

Я могу указать соответствующий путь к файлу, чтобы сгенерировать список файлов, которые я хочу за данный год, но затем, когда я использую свою функцию для извлечения конкретной ячейки, которую я хочу, она ищет файл в каталоге, который неправильно. Можете ли вы помочь мне? Мне кажется, что я упускаю что-то простое, но я не смог найти то, что мне нужно.

Пример составления списка всех файлов на зиму 1979-1980 годов:

w1979s1980 <-  as.vector(list.files(path="SnowDepth/WS1979_1980data", pattern=".img"))`

Функция для извлечения глубины снега из данной ячейки для всех файлов в этом списке:

cell.depthKotz <- function(depthfile){
  depth.val <- c()
  for(i in 1:length(depthfile)) {
  depth.mat <- matrix(readBin(depthfile[i], what="integer", n=136192, size=2, endian="little"), 
                      nrow=448, ncol=304, byrow=TRUE)
  depth.val[i] <- depth.mat[187,65]
  depth.val[depth.val == 110] <- NA
  depth.val[depth.val == 120] <- NA
  depth.val[depth.val == 130] <- NA
  depth.val[depth.val == 140] <- NA
  depth.val[depth.val == 150] <- NA
  depth.val[depth.val == 160] <- NA
  }  
  return(depth.val)
}

И затем, вероятно, сохраните это как вектор, когда я запустил функцию для данного года:

Sdepths1978.1979 <- as.vector(cell.depthKotz(w1979s1980))

Я должен добавить, что я очень новичок во всем этом, поскольку даже знаю, как сформулировать то, что я прошу, поэтому дайте мне знать, если мне нужно отредактировать заголовок / вопрос или добавить больше деталей. Меня не волнует время выполнения, если вы видите подобную неэффективность в вышеприведенных функциях, но если есть очевидные изменения, которые означали бы меньше повторяющихся / ручных усилий от меня и более автоматизированные усилия от R, не стесняйтесь говорить об этом. Спасибо за вашу помощь!

1 Ответ

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

В функции list.files есть флаг recursive.

files <- list.files(path = "src", pattern = "\\.jpg$", recursive = TRUE)

Если вы указали путь к родительскому каталогу. И добавьте флаг recursive = T, вы должны быть хорошими.

При желании вы можете изменить шаблон так, чтобы он заканчивался на $, указав, что файлы должны заканчиваться этим шаблоном. В редком случае, когда в каталоге есть другой файл с именем someinfo.img.txt, он будет проигнорирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...