написание цикла для апскейлинга осадков для США

Я пишу код для расчета среднего количества осадков для разных регионов совпадающих США. Мои общие данные имеют 300 сеток по 120 (долгота * широта) в формате Netcdf. Я хочу написать цикл в R, чтобы взять среднее значение для каждого количества сеток 10 на 10 и присвоить это значение (среднее) всем сеткам внутри региона и повторить это для следующего региона. В конце вместо 120 на 300 сеток у меня будет 12 на 30 сеток. Так что это своего рода метод масштабирования, который я хочу применить к своим данным. Я могу использовать цикл for для каждого региона отдельно, но это делает мой код очень большим, и я не хочу этого делать. Любая идея будет оценена. Спасибо. P.S. Вот функция, которую я написал для одного региона (10х10) широта*долгота.

upscaling <- function(file, variable, start.time=1, count.time=1)
{
  library(ncdf)   # load ncdf library to manipulate ncdf data
  ncdata <- open.ncdf(file);      # open ncdf file
  lon  <- get.var.ncdf(ncdata, "lon");
  lat  <- get.var.ncdf(ncdata, "lat");
  time <- get.var.ncdf(ncdata, "time");
  start.lon <- 1
  end.lon   <- length(lon)
  start.lat <- 1
  end.lat   <- length(lat)
  count.lon <- end.lon - start.lon + 1;   # count number of longitude
  count.lat <- end.lat - start.lat + 1;   # count number of latitude
  dat <- get.var.ncdf(ncdata, variable, start=c(start.lon, start.lat, 1),               
                      count=c(count.lon, count.lat, 1))
  temp.data<- array(0,dim=c(10,10))
  for (i in 1:10)
  {
    for (j in 1:10)
    {
      temp.data <- mean(dat[i,j,])
    }
  }
}

person SaZa    schedule 16.08.2013    source источник
comment
Почему вы не можете просто перебрать все регионы, используя эту функцию? Разве у вас не было бы просто этого кода и небольшого цикла, который передает каждый файл вашей функции?   -  person John Paul    schedule 16.08.2013
comment
ПРИМЕЧАНИЕ. Вы не можете использовать MEAN для усреднения по обычной сетке широты и долготы, вам необходимо учитывать размеры ячеек сетки, иначе ваш ответ будет неверным. Лучше использовать для этого CDO   -  person Adrian Tompkins    schedule 31.03.2018


Ответы (2)


Нет необходимости создавать беспорядочный цикл для пространственной агрегации ваших данных. Просто используйте агрегатную функцию в растровом пакете:

library(raster)
a=matrix(data=c(1:100),nrow=10,ncol=10)
a=raster(a)
ra  <-  aggregate(a,  fact=5,  fun=mean) #fact=5 will aggregate using a 5x5 window
ra=as.matrix(ra)
ra

Теперь для ваших данных netcdf используйте растр rasterFromXYZ, чтобы создать растр, который затем можно агрегировать вышеуказанным методом. Бонус включает в себя возможность определить вашу проекцию в качестве аргумента в функции, чтобы в конце вы получили объект с географической привязкой. Это важно, потому что, если вы агрегируете свои данные без него, вам придется вручную выяснять, как выполнить географическую привязку полученной матрицы.

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы результирующий растр имел те же размеры, что и исходный, дезагрегируйте данные сразу после их агрегирования. Хотя это кажется излишним, эти растровые методы очень быстрые.

library(raster)
a=matrix(data=c(1:100),nrow=10,ncol=10)
a=raster(a)
ra  <-  aggregate(a,  fact=5,  fun=mean) #fact=5 will aggregate using a 5x5 window
ra  <-  disaggregate(ra, fact=5)
ra=as.matrix(ra)
ra
person Lucas Fortini    schedule 16.08.2013
comment
Спасибо, Лукас. Это очень хорошая идея, но есть только одна проблема. В конце ra дает мне матрицу 12 на 36. мне нужна матрица 120 на 360, в которой значения в каждом наборе массивов 10 * 10 внутри матрицы (строки * столбцы) равны. - person SaZa; 16.08.2013
comment
Извините, я неправильно понял, если вы хотите сохранить исходное разрешение, используйте функцию фокуса: ra ‹- focus(a, w=5, fun=mean) - person Lucas Fortini; 16.08.2013
comment
Нет, ваш ответ был идеальным и очень полезным. Я думаю, что я не очень хорошо передал то, что я хочу от кода. большое спасибо. - person SaZa; 16.08.2013
comment
Привет, я только что проверил значения фокусного эффекта, которые я предложил, и я думаю, что был неправ - проверьте редактирование, которое у меня есть к моему ответу, которое, как я полагаю, делает именно то, что вы просили. - person Lucas Fortini; 17.08.2013
comment
ПРИМЕЧАНИЕ. Вы не можете использовать MEAN для усреднения по обычной сетке широты и долготы, вам необходимо учитывать размеры ячеек сетки, иначе ваш ответ будет неверным. Размер ошибки будет небольшим для этой конкретной задачи (разрешение в порядке и составляет всего 10x10 в среднем), но ответ будет неверным. - person Adrian Tompkins; 31.03.2018

Если ваши определения сетки следуют стандартным соглашениям netcdf, вы можете выполнить переназначение с помощью функций переназначения CDO. Для консервативного переназначения первого порядка вы можете попробовать

cdo remapcon,grid_specification_here in.nc out.nc 

Обратите внимание, что приведенный выше ответ является приблизительным и не совсем правильным, поскольку размер ячейки сетки не совпадает с функцией широты. Размер ошибки, вероятно, невелик для этой конкретной задачи, поскольку размеры ячеек в порядке, но, тем не менее, ответ будет немного неверным.

person Adrian Tompkins    schedule 31.03.2018