È possibile utilizzare gdalUtils::gdalwarp
per questo. Per me, è meno efficiente di @fasterAgg.Fun
di JosephWood per i raster con 1.000.000 di celle, ma per l'esempio più grande di Joseph è molto più veloce. Richiede che il raster esista su disco, quindi calcoli il tempo di scrittura nel sotto se il tuo raster è in memoria.
Di seguito, ho utilizzato la modifica di fasterAgg.Fun
che restituisce il valore più frequente di anziché il suo indice nel blocco.
library(raster)
x <- matrix(rpois(10^8, 2), 10000)
a <- raster(x)
fasterAgg.Fun <- function(x,...) {
myRle.Alt <- function (x1) {
n1 <- length(x1)
y1 <- x1[-1L] != x1[-n1]
i <- c(which(y1), n1)
x1[i][which.max(diff(c(0L, i)))]
}
if (sum(x)==0) {
return(NA)
} else {
myRle.Alt(sort(x, method="quick"))
}
}
system.time(a2 <- aggregate(a, fact=10, fun=fasterAgg.Fun))
## user system elapsed
## 67.42 8.82 76.38
library(gdalUtils)
writeRaster(a, f <- tempfile(fileext='.tif'), datatype='INT1U')
system.time(a3 <- gdalwarp(f, f2 <- tempfile(fileext='.tif'), r='mode',
multi=TRUE, tr=res(a)*10, output_Raster=TRUE))
## user system elapsed
## 0.00 0.00 2.93
noti che v'è una leggera differenza nella definizione della modalità quando ci sono vincoli: gdalwarp
seleziona il valore più alto, mentre le funzioni passate al aggregate
sopra (attraverso comportamenti which.max
s') selezionare il più basso (ad esempio , vedi which.max(table(c(1, 1, 2, 2, 3, 4)))
).
Inoltre, la memorizzazione dei dati raster come numero intero è importante (se applicabile). Se i dati sono memorizzati come float (il valore predefinito di writeRaster
), ad esempio, l'operazione gdalwarp
in alto richiede circa 14 secondi sul mio sistema. Vedi ?dataType
per i tipi disponibili.
Si noti che 'which.max (table (x))' restituisce l'indice del valore con la ripetizione massima, non il valore. La maggior parte degli indici nel tuo caso coinciderà con i valori ma per essere sicuro di avere il valore che dovresti usare 'as.numeric (nomi (which.max (table (x)))) ... – digEmAll
Per quanto riguarda le prestazioni ... beh suppongo che dovresti ricorrere a qualche pezzo di codice Rcpp per ottenere qualcosa ... – digEmAll