Muestreo aleatorio de ráster con R?

13

¿Existe una forma directa de muestrear aleatoriamente un ráster para que la salida del proceso sea un ráster?

Estoy usando un ejemplo que encontré en la r-sig-geo lista y también probé la sampleRandomfunción en el rasterpaquete. Ambos enfoques producen una salida que no estoy seguro de cómo transformar en una trama. No pude encontrar un enfoque después de buscar varias combinaciones de "Ráster SpatialPointsDataFrame".

library(raster)

# read in raster
rasterSource <- 'landsat.TIF'
r <- raster(rasterSource)

# convert to spatial points data frame
r.spgrd<-as(r,"SpatialPointsDataFrame") 

# elminate NA values
r.spgrd = r.spgrd[!is.na(r.spgrd[[1]]),] 

# sample points
selectedPoints = sample(1:length(r.spgrd[[1]]), 1000)
r.sampled = r.spgrd[selectedPoints,]

# try to make spgrd into a raster
r.test <- raster(r.sampled)

Cuando corro r.testme sale el resultado:

class       : RasterLayer 
dimensions  : 10, 10, 100  (nrow, ncol, ncell)
resolution  : 28617, 14766  (x, y)
extent      : 1838505, 2124675, 2328685, 2476345  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
values      : none

Para que la siguiente línea que intenta escribir un ráster produzca el mensaje:

# write out as ascii file
writeRaster(r.test, filename="test1.ASC", datatype="ascii", overwrite=TRUE)

Error: hasValues(x) is not TRUE

Mi objetivo principal es producir algún tipo de trama después del proceso de muestreo. También estoy bien con solo cambiar los valores dentro de mi ráster (simplemente no estoy seguro de cómo hacerlo).

djq
fuente

Respuestas:

21

Puede adaptar ejemplos de la viñeta del Rasterpaquete , sección 5.2. Aquí hay una manera:

r <- raster(ncol=30,nrow=20)
r[] <- 1:(30*20)              # Raster for testing
#plot(r)                      # (If you want to see it)
r[runif(30*20) >= 0.30] <- NA # Randomly *unselect* 70% of the data
plot(r)

Selección de trama

whuber
fuente
10
Esta respuesta me hace querer aprender R ...
SaultDon
2
Esto puede ser extremadamente obvio, pero me tomó un tiempo darme cuenta de que el valor de cualquier celda puede ser referenciado por r[r "condition"]. Entonces, si desea establecer todo el valor del ráster que 100debe ser 1, puede escribir r[r == 100] <- 1. Gracias @whuber - ¡ejemplo extremadamente útil!
djq
@whuber ¿Alguna pista de por qué aparece el Error: hasValues ​​(x) no es VERDADERO?
csheth
2

Puedes usar la sampleRandomfunción:

library(raster)
r <- raster(ncol=30,nrow=20)
r[] <- 1:ncell(r)

x <- sampleRandom(r, ncell(r)*.3, asRaster=TRUE)
Robert Hijmans
fuente