2016-03-20 15 views
1

Ich bin neu in der Verwendung des R-Programms. Ich habe einen Stapel von 10 Rastern, wobei jedes Raster die Wahrscheinlichkeit (zwischen 0 und 1) eines Ökosystemtyps (z. B. Nadelwald, Grünland, Feuchtgebiet) repräsentiert, der an einem gegebenen Punkt (Pixel) in der Landschaft auftritt. Alle Raster-Layer haben die gleiche Anzahl von Zeilen und Spalten.R (Raster): Wie man Krawatten mit which.max

Ich habe den Befehl "which.max" im Raster-Paket verwendet, um herauszufinden, welche Rasterebene (Ökosystemtyp) an einem Punkt in der Landschaft am häufigsten auftritt. Ich speichere das resultierende Raster als ASCII-Rasterdatei und schaue es in ArcMap oder SAGA an, um zu sehen, wie die 10 Ökosystemtypen über das Untersuchungsgebiet verteilt sind. Das resultierende Raster identifiziert den Ökosystemtyp an jedem Pixel, indem es identifiziert, welche Ebene im Rasterstapel die höchste Wahrscheinlichkeit hat. Wenn also der Wert "1" ist, hat das erste Raster im Stapel die höchste Wahrscheinlichkeit an diesem Punkt in der Landschaft aufzutreten .

Wenn ich jedoch davon ausginge, dass zwei oder mehr Raster den gleichen Wert haben, identifiziert der Befehl "which.max" nur eine Rasterebene (das letzte Raster mit dem verknüpften Wert?). Dies bedeutet, dass das resultierende Raster stark von der Reihenfolge beeinflusst werden kann, in der ich die 10 Ökosystemtypen im Rasterstapel zugewiesen habe.

Was ich tun möchte, ist eine resultierende Raster-Datensatz, die Ebenen gebunden, wenn mehr als ein Raster-Layer die gleiche maximale Wahrscheinlichkeit hat. Zum Beispiel dachte ich, dass, wenn die Ebenen 4 und 8 im Rasterstapel denselben maximalen Wert haben, die resultierende Rasterebene dies durch Aufzeichnen des Werts "48" identifizieren könnte. Oder wenn drei Rasterlayer alle den gleichen Maximalwert hatten, könnte der resultierende Wert "259" sein.

Hat jemand irgendwelche Vorschläge, wie man das macht?

Danke.

Antwort

2

versuchen Sie dies:

> # create a small sample set 
> raster <- matrix(sample(3, 25, TRUE), 5) 
> raster 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 3 1 2 3 2 
[2,] 2 1 2 1 3 
[3,] 2 1 1 2 1 
[4,] 1 3 2 3 2 
[5,] 1 3 3 1 3 
> # create a new value representing the column number (assuming 1-9) 
> cols <- apply(raster, 1, function(.row){ 
+  mCols <- which(.row == max(.row)) 
+  sum(mCols * 10^(rev(seq_along(mCols)) - 1)) 
+ }) 
> cbind(raster, cols) 
       cols 
[1,] 3 1 2 3 2 14 
[2,] 2 1 2 1 3 5 
[3,] 2 1 1 2 1 14 
[4,] 1 3 2 3 2 24 
[5,] 1 3 3 1 3 235 
+0

Vielen Dank! Ich muss die Befehle noch ein wenig besser verstehen, aber das hat mir Stunden an Zeit gespart und weist mich in die richtige Richtung! – MikeR

0

Hier ein Beispiel mit einem RasterBrick basierend auf schönes Beispiel

whiches <- function(i, stat=max) { 
    m <- which(i == stat(i, na.rm=TRUE)) 
    sum(m * 10^(rev(seq_along(m)) - 1)) 
} 

library(raster) 
b <- brick(system.file("external/rlogo.grd", package="raster")) 
x <- calc(b, whiches) 

freq(x) 
plot(x) 

Hinweis Data Munger, dass Sie nur diese verwenden können, wenn Sie weniger als 10 Schichten haben!

+0

Das ist großartig! Vielen Dank für die Programmierung - es hilft mir wirklich sehr. – MikeR