Amostragem aleatória de varredura usando R?

13

Existe uma maneira simples de amostrar aleatoriamente uma varredura para que a saída do processo seja uma varredura?

Estou usando um exemplo que encontrei na r-sig-geo lista e também tentei a sampleRandomfunção no rasterpacote. Ambas as abordagens produzem uma saída que não tenho certeza de como transformar em uma varredura. Não consegui encontrar uma abordagem depois de pesquisar várias combinações de "SpatialPointsDataFrame raster".

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)

Quando executo r.test, recebo a saída:

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 a seguinte linha que tenta escrever uma varredura produza a mensagem:

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

Error: hasValues(x) is not TRUE

Meu principal objetivo é produzir algum tipo de varredura após o processo de amostragem. Também estou bem em mudar os valores dentro da minha varredura (não sei como fazer isso).

djq
fonte

Respostas:

21

Você pode adaptar exemplos da vinheta deRaster pacote , seção 5.2. Aqui está uma maneira:

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)

Seleção raster

whuber
fonte
10
Essa resposta me faz querer aprender R ...
SaultDon
2
Isso pode ser extremamente óbvio, mas levei algum tempo para perceber que o valor de qualquer célula pode ser referenciado por r[r "condition"]. Então, se você deseja definir todo o valor do raster que estão 100a ser 1você pode escrever r[r == 100] <- 1. Obrigado @whuber - exemplo extremamente útil!
DJQ
@whuber Alguma pista do porquê o erro: hasValues ​​(x) não é VERDADEIRO apareceu?
csheth
2

Você pode usar a sampleRandomfunção:

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

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