Вы можете использовать пакет raster
и его функцию focal
для вычислений с движущимся окном.
Сначала я создам фиктивный фрейм data.frame, который представляет ваши данные
# Prepare dummy data.frame
set.seed(2222)
lonlat <- expand.grid(1:10, 1:10)
df <- data.frame( lon = lonlat[, 1],
lat = lonlat[, 2],
ANNUAL_MEAN = rnorm(100),
ANNUAL_RANGE = runif(100, 1, 5)
)
Теперь нам нужно преобразовать фрейм данных в растр и выполнить усреднение движущегося окна.
library(raster)
# Convert data frame to raster object
rdf <- df
coordinates(rdf) <- ~ lon + lat
gridded(rdf) <- TRUE
rdf <- brick(rdf) # our raster brick
## Perform moving window averaging
# prepare weights matrix (5*5)
w <- matrix(1, ncol = 5, nrow = 5)
# perform moving window averaging
ANNUAL_MEAN_AVG <- focal(rdf[[1]], w, mean, pad = TRUE, na.rm = TRUE)
ANNUAL_RANGE_AVG <- focal(rdf[[2]], w, mean, pad = TRUE, na.rm = TRUE)
# Append new data to initial data.frame
df$ANNUAL_MEAN_AVG <- as.data.frame(ANNUAL_MEAN_AVG)
df$ANNUAL_RANGE_AVG <- as.data.frame(ANNUAL_RANGE_AVG)
Теперь каждая ячейка в df$ANNUAL_MEAN_AVG
и df$ANNUAL_RANGE_AVG
содержит среднее значение соответствующего квадрата 5 * 5.
UPD 1. Сокращение выборки 5x5
Если вам нужны фиксированные ячейки сетки 5x5 со средними значениями для каждой ячейки, вы можете использовать функцию raster::agregate
.
Работа с растровым кирпичом rdf
из предыдущего примера.
# perform an aggregation with given downsampling factor
rdf_d <- aggregate(rdf, fact=5, fun = mean)
# Now each pixel in the raster `rdf_d` contains a mean value of 5x5 pixels from initial `rdf`
# we need to get pixels coordinates and their values
coord <- coordinates(rdf_d)
vals <- as.data.frame(rdf_d)
colnames(coord) <- c("lon", "lat")
colnames(vals) <- c("ANNUAL_MEAN_AVG", "ANNUAL_RANGE_AVG")
res <- cbind(coord, vals)