2013-08-16 1 views
0

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

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,]) 
    } 
    } 
} 
+0

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

ответ

3

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

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 растра для создания растра, которые затем могут быть агрегируются с описанным выше способом. Бонус включает в себя опцию для определения вашей проекции в качестве аргумента в функции, поэтому в конце вы заканчиваете объект с привязкой. Это важно, потому что, если вы агрегируете свои данные без него, вам придется вручную выяснить, как привязать результирующую матрицу.

EDIT: Если вы хотите получить результирующий растровый размер с теми же размерами, что и исходный, дезагрегируйте данные сразу после его агрегации. Хотя это кажется излишним, эти растровые методы очень быстрые.

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 
+0

Спасибо, Лукас. Это очень хорошая идея, но есть только одна проблема. В конце «ra» дает мне матрицу 12 на 36. мне нужна матрица размером 120 на 360, что значения в каждом наборе 10 * 10 массивов внутри матрицы (столбцы строк *) равны. – SaZa

+0

Извините, что я неправильно понял, если вы хотите сохранить исходное разрешение, используйте фокальную функцию: ra <- focal (a, w = 5, fun = mean) –

+0

Нет ответа, который был бы идеальным и очень полезным. Я думаю, что не очень хорошо передал то, что хочу от кода. большое спасибо. – SaZa

 Смежные вопросы

  • Нет связанных вопросов^_^