2015-07-21 12 views
5

Potrzebujesz rozwiązania, pomoc będzie bardzo doceniana.Wykonywanie pętli na liście list rastrowych

W poniższym kodzie tworzę trzy rastry. Następnie utworzę losowe number miejsc punktowych na tym rastrze i otrzymuję listę trzech macierzy z współrzędnymi losowych lokalizacji o nazwie samples. Następnie wybieram te lokalizacje i próbuję wartości rastrowe, aby otrzymać samplevalues.

Chcę zmienić zestaw 100,150,200 i 250 punktów losowych (numberv). Więc po wygenerowaniu tych lokalizacji i otrzymaniu listy lokalizacji, każdy raster będzie próbkowany length(numberv) razy (w tym przypadku 4 razy). Ponieważ mam trzy rastry, chciałbym otrzymać listę z pierwszym elementem, w tym wartości próbki uzyskane z trzech rastrów próbkowanych 100 razy, drugi z wartościami rastrowymi próbkowanymi 150 razy, itd. Lista miałaby elementy length(numberv). Następnie użyłbym tych lokalizacji, aby uzyskać wartości rastrowe w tych lokalizacjach.

Wkleiłem czysty kod dla prostszej obudowy za pomocą tylko jednej próbki (użyty wektor 1-elementowy number), mam nadzieję, że pomoże.

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

Odpowiedz

1

Czy to działa?

# 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

dziękuję bardzo, dokładnie to, czego potrzebowałem :) – MIH

+1

nie ma za co. –

+0

w jaki sposób można zrestrukturyzować funkcję sample.extract, więc chcielibyśmy przyjrzeć się sample.set [[1]] [2], aby uzyskać wartość rastra z rastrów [1]. Następnie sample.set [[1]] [3] i uzyskaj wartość rastra z rastrów [2]. Wynikiem będzie lista 4 elementów, każdy element będzie listą dwóch elementów. Zadałem nowe pytanie tutaj http://stackoverflow.com/questions/31585708/sampling-with-list-of-rasters-and-locations-using-function-in-r – MIH

Powiązane problemy