#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)