Как выполнить один и тот же набор команд отдельно для каждого файла с одинаковым путем к файлу? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь разобраться с извлечением подмножества из нескольких файлов .grb2 по одному и тому же пути и записать их в CSV-файл. Я могу сделать это для одного (или нескольких), используя следующий набор команд:

GRIB <- brick("tmp2m.1989102800.time.grb2")
GRIB <- as.array(GRIB)
readGDAL("tmp2m.1989102800.time.grb2")
tmp2m.6hr <- GRIB[51,27,c(261:1232)]
str(tmp2m.6hr)
tmp2m.data <- data.frame(tmp2m.6hr)
write.csv(tmp2m.data,"tmp1.csv")

Приведенный выше набор команд извлекает в csv значения температуры для определенной широты "51" и долготы "27", а также для определенного диапазона времени "c (261: 1232)".

Теперь у меня есть сотни этих файлов (с разными именами, конечно) в одном каталоге, и я хочу сделать то же самое для всех. Как вы знаете, лучше меня, я не могу сделать это один за другим, меняя имя файла каждый раз.

Я много боролся с этим, но пока мне это не удавалось. Поскольку я новичок в R, и мои знания ограничены, я буду очень признателен за любую возможную помощь в этом.

1 Ответ

0 голосов
/ 07 марта 2019

Самый простой способ - использовать цикл for:

path <- "your file path here"
input.file.names <- dir(path, pattern =".grb2")
output.file.names <- paste0(tools::file_path_sans_ext(file.names),".csv")
for(i in 1:length(file.names)){
  GRIB <- brick(input.file.names[i])
  GRIB <- as.array(GRIB)
  readGDAL(input.file.names[i]) # edited line
  tmp2m.6hr <- GRIB[51,27,c(261:1232)]
  str(tmp2m.6hr)
  tmp2m.data <- data.frame(tmp2m.6hr)
  write.csv(tmp2m.data,output.file.names[i])
}

Конечно, вы можете создать тело цикла for в функции, а затем использовать стандартный lapply или * 1005.* function from purrr.

Обратите внимание, что этот код будет распечатывать различные файлы CSV.Если вы хотите добавить данные в один файл, вы должны проверить write.table

...