Ошибка при извлечении файлов netcdf в растр

У меня есть много файлов NCDF в папке. Я пытаюсь извлечь их в растровый кирпич, используя пакеты raster и ncdf4. Если я отдельно извлекаю каждый файл NCDF, он работает. Однако я пытаюсь извлечь все файлы, используя цикл for, и выдает ошибку.

R<-list.files("D:/Results/TimeSeries/NETCDF/")
r<-brick(paste0("D:/Results/TimeSeries/NETCDF/",R[[1]]),varname="T_min")

for(i in 2:length(R)){
r1<-brick(paste0("D:/Results/TimeSeries/NETCDF/",R[[i]]),varname="T_min")
r<-brick(r,r1)
}

Ошибка в as.integer(nl): невозможно привести тип «S4» к вектору типа «целое число»

Если я посмотрю на r и r1 по отдельности, они, кажется, имеют одинаковую степень, и оба являются растровым типом кирпича:

> r
class       : RasterBrick 
dimensions  : 81, 81, 6561, 122  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : 0.5, 81.5, 0.5, 81.5  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : D:\Results\TimeSeries\NETCDF\timeseries_1km_2026.nc 
names       : X0026.05.02, X0026.05.03, X0026.05.04, X0026.05.05, X0026.05.06, X0026.05.07, X0026.05.08, X0026.05.09, X0026.05.10, X0026.05.11, X0026.05.12, X0026.05.13, X0026.05.14, X0026.05.15, X0026.05.16, ... 
Date        : 0026-05-02, 0026-08-31 (min, max)
varname     : T_min 

> r1
class       : RasterBrick 
dimensions  : 81, 81, 6561, 122  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : 0.5, 81.5, 0.5, 81.5  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : D:\Results\TimeSeries\NETCDF\timeseries_1km_2027.nc 
names       : X0027.05.02, X0027.05.03, X0027.05.04, X0027.05.05, X0027.05.06, X0027.05.07, X0027.05.08, X0027.05.09, X0027.05.10, X0027.05.11, X0027.05.12, X0027.05.13, X0027.05.14, X0027.05.15, X0027.05.16, ... 
Date        : 0027-05-02, 0027-08-31 (min, max)
varname     : T_min 

Пожалуйста помоги.


person rar    schedule 03.11.2016    source источник
comment
Хорошо... Это была небольшая ошибка. Вместо brick(r,r1) нам нужно использовать stack(r,r1), и это прекрасно работает.   -  person rar    schedule 03.11.2016


Ответы (1)


Нет необходимости зацикливаться, raster векторизован, попробуйте

p <- "D:/Results/TimeSeries/NETCDF"
R <- list.files(p, pattern = "nc$")

r <- raster::stack(file.path(p, R), varname = "T_min")

Если бы вам нужно было зацикливаться, я бы сделал это так:

r <- raster::stack(lapply(file.path(p, R), raster::raster, varname = "T_min"))

Изменить: заменить raster::raster на raster::stack.

Также обратите внимание на использование file.path и возможности, доступные в list.files. (Вставка текста для путей к файлам может быть проблематичной и более сложной, чем использование доступных функций).

person mdsumner    schedule 03.11.2016
comment
На самом деле у меня есть 40 файлов NCDF, и каждый из них содержит 122 данных временных рядов. Итого у меня должно быть 4880 слоев в финале. Однако, если я использую эти коды, я получаю 1-й слой из каждого файла, поэтому на выходе получается 40 слоев. Буду признателен, если это можно сделать без цикла. - person rar; 03.11.2016
comment
Используйте raster::stack в lapply, ? - person mdsumner; 03.11.2016
comment
Это работает с r <- raster::stack(lapply(file.path(p, R), raster::stack, varname = "T_min")) Так что нам нужен цикл для этого. Но спасибо за этот гораздо более простой код! - person rar; 03.11.2016
comment
Я забыл о многовариантности, вы должны проверить неограниченные значения измерений (время здесь), нет гарантии, что они регулярны, в порядке, конкурируют, соответствуют единицам и т. д. Я вообще не доверяю этим коллекциям, слишком много md расплывчато и сложно. - person mdsumner; 03.11.2016