2015-07-21 8 views
5

Benötigen Sie eine Lösung, Hilfe wird sehr geschätzt.Performing Loops auf der Liste der Raster

Im folgenden Code erstelle ich drei Raster. Ich erstelle dann ein zufälliges number der Punktpositionen auf diesem Raster und ich empfange eine Liste von drei Matrizen mit Koordinaten dieser zufälligen Positionen, die samples genannt werden. Ich nehme dann diese Orte und Muster Raster-Werte, um samplevalues zu erhalten.

Was ich ändern möchte, ist, dass ich eine Reihe von 100.150.200 und 250 zufällige Punktpositionen (numberv) erstellen möchte. Nach dem Erzeugen dieser Orte und dem Empfangen einer Liste von Orten wird daher jedes Raster length(numberv) Mal (in diesem Fall 4 Mal) abgetastet. Da ich drei Raster habe, möchte ich eine Liste mit dem ersten Element erhalten, einschließlich der Sample-Werte meiner drei Raster, die jeweils 100 Mal gesampelt wurden, die zweite mit Rasterwerten, die jeweils 150 Mal gesampelt wurden. Die Liste hätte length(numberv) Elemente. Dann würde ich diese Orte verwenden, um die Rasterwerte an diesen Stellen zu erhalten.

Ich eingefügt sauberen Code für einen einfacheren Fall mit nur einer Probe (1 Element Vektor number verwendet), hoffe es hilft.

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]])) 
} 

Antwort

1

Funktioniert das?

# 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

vielen dank, es ist genau das, was ich brauchte :) – MIH

+1

du bist willkommen. –

+0

wie die sample.extract-Funktion restrukturiert werden könnte, also würden wir versuchen, sample.set [[1]] [2] zu nehmen, um Rasterwerte aus Rastern [1] zu erhalten. Dann sample.set [[1]] [3] und erhalte Rasterwert aus Rastern [2]. Das Ergebnis wäre eine Liste von 4 Elementen, jedes Element wäre eine Liste von zwei Elementen. Ich habe eine neue Frage hier http://stackoverflow.com/questions/31585708/sampling-with-list-of-rasters-and-locations-using-function-in-r – MIH