Как создать стек растров из нескольких растров PRISM .bil с циклом for?

#r #prism #raster

Вопрос:

У меня есть 37 растров для годовых климатических данных PRISM в одной папке, но я не нашел более простого способа загрузки растров в R, кроме как вручную по одному за раз.

Я попытался использовать этот цикл for для загрузки растров и объединения их в один фрейм данных:

создать стек

 mystack <- pd_stack(prism_archive_subset("ppt","annual", years = 1982:2019))
 

Создайте фрейм данных для цикла, чтобы сложить весь растр вместе.

 filenames <- list.files(path = "./ppt rasters", pattern= '.bil', all.files=TRUE)
filenames

ncols <- dim(precip1982)[1]
nrows <- dim(precip1982)[2]

rasters <- stack(list(filenames))
 

инициализация большого объекта

 final.df <- as.data.frame(matrix(NA,nrow = nrows, ncol = ncols)) 
counter=1
 

для циклического просмотра всех файлов

 for (file in filenames){
r <- raster(filenames)
test <- as.data.frame(r, na.rm=TRUE, row.names=TRUE, col.names=FALSE)
names(test)<- c(substring(file, 24, 29))
final.df <- cbind(z, test)
}

final.df[counter-1:nrow(final.df),]<-NULL
 

Я получаю ошибки, говорящие о том, что .local(.object…) : с другими ошибками.

Есть ли лучший способ настроить цикл таким образом, чтобы он выполнялся? Спасибо!

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос. Можете ли вы лучше объяснить, что вы пытаетесь сделать, что работает, а что нет? И используйте примеры данных (см. ?стек).

Ответ №1:

prism::pd_stack() возвращает raster::RasterStack объект, поэтому вам нужно использовать as.data.frame() метод растра для каждого слоя.

Возможно, вы захотите сначала обрезать/обрезать данные. В моем тесте всего за 2 года данных prism потребовалось ~3 минуты, чтобы создать кадр данных объемом 1,3 ГБ из растрового пакета.

 library(prism)

# get 2 years of precip data as example
get_prism_annual("ppt", 2018:2019)

# get all the precip data from the prism archive as a RasterStack
# note that prism_archive_subset() will only return the 2018 and 2019 data
# if that is all that exists
mystack <- pd_stack(prism_archive_subset("ppt","annual", years = 1982:2019))

# now convert to data frame (each layer in the RasterStack is a Raster)
df <- lapply(mystack, as.data.frame)