2015-07-21 9 views
5

La soluzione necessaria, l'aiuto sarà molto apprezzato.Esecuzione di loop nell'elenco di elenchi di raster

Nel seguente codice sto creando tre raster. Creo quindi un numero casuale number di punti su questo raster e sto ricevendo un elenco di tre matrici con le coordinate di quelle posizioni casuali chiamate samples. Quindi prendo quelle posizioni e provo i valori raster per ricevere samplevalues.

Quello che voglio cambiare è che voglio creare un set di 100,150,200 e 250 posizioni di punti casuali (numberv). Quindi, dopo aver generato queste posizioni e aver ricevuto un elenco di posizioni, ogni raster sarà campionatovolte (in questo caso 4 volte). Dato che ho tre raster, mi piacerebbe ottenere una lista con il primo elemento, compresi i valori campione ottenuti dai miei tre raster campionati 100 volte ciascuno, il secondo con valori raster campionati 150 volte ciascuno, ecc. L'elenco avrebbe elementi length(numberv). Quindi userei quelle posizioni per ottenere i valori raster in queste posizioni.

Ho incollato il codice pulito per un caso più semplice con un solo campione (1 elemento vettore number utilizzato), sperare che sia d'aiuto.

y <- matrix(1:300,100,3) 
mv <- c(1,2,3) 
rep = 200 

valuematrix <- vector("list",ncol(y)) 

for (i in 1:ncol(y)) { 
     newmatrix <- replicate(rep,y[,i]) 
     valuematrix[[i]] <- newmatrix 
} 

library(sp) 
library(raster) 

rasters <- setNames(lapply(valuematrix, function(x) raster(x)), 
        paste0('raster',1:length(mv))) 

# Create a loop that will sample the rasters 

library(dismo) 

number = 100      # current number for random sample points number 
numberv = c(100,150,200,250)  # sample number vector i want to use 

# samples below will hold only coordinate values: 
samples <- setNames(lapply(rasters, function(x) randomPoints(raster(x), 
                  n=number)), 
        paste0('sample',1:length(mv))) 

samplevalues <- vector("list",ncol(y)) 

for (i in 1:ncol(y)) { 
     samplevalues[[i]] <- data.frame(samples[[i]],extract(rasters[[i]], 
                  samples[[i]])) 
} 

risposta

1

Funziona?

# Function to sample using a given number (returns list of three) 
sample.number <- function(x) { 
    rps <- lapply(rasters, function(y) randomPoints(raster(y),n=x)) 
    setNames(rps,paste0('sample',1:length(mv))) 
} 

# Apply sample.number() to your numberv list 
sample.set <- lapply(numberv,sample.number) 

# Function to extract values from a given sample 
sample.extract <- function(x) { 
    lapply(1:length(x),function(y) data.frame(x[[y]],extract(rasters[[y]],x[[y]]))) 
} 

# Apply sample.extract() to the set of samples (returns list of four lists) 
sample.values <- lapply(sample.set,sample.extract) 

# Access sample 1 of number 200 
summary(sample.values[[3]][[1]]) 
+0

grazie mille, è esattamente quello che mi serviva :) – MIH

+1

prego. –

+0

come la funzione sample.extract potrebbe essere ristrutturata, quindi dovremmo prendere sample.set [[1]] [2] per ottenere il valore raster dai raster [1]. Quindi sample.set [[1]] [3] e ottieni il valore raster dai raster [2]. Il risultato sarebbe un elenco di 4 elementi, ogni elemento sarebbe un elenco di due elementi. Ho postato una nuova domanda qui http://stackoverflow.com/questions/31585708/sampling-with-list-of-rasters-and-locations-using-function-in-r – MIH