2017-10-29 3 views
0

. Nach dieser Frage (Find second highest value on a raster stack in R), wie kann man für jede xy-Koordinate des Rasterstapels den Namen der Ebene finden, die den zweithöchsten Wert enthält?Finden Sie Layernamen für die zweithöchsten Werte in einem Rasterstapel in R

Ich bin in der Lage, den Namen (Schichtnummer) der Schicht zu finden, den höchsten Wert mit einer „which.max()“ Funktion enthält:

set.seed(123) 
require(raster) 
r1 <- raster(nrows = 10, ncols = 10) 
r2 <- r3 <- r4 <- r1 
r1[] <- runif(ncell(r1)) 
r2[] <- runif(ncell(r1)) + 0.2 
r3[] <- runif(ncell(r1)) - 0.2 
r4[] <- runif(ncell(r1)) 
rs <- stack(r1, r2, r3, r4) 

which.max.na <- function(x, ...) ifelse(length(x) == sum(is.na(x)), 0, which.max(x)) 

m1 <- calc(rs, which.max.na) 

plot(m1) 

Doch wie kann ich ein Raster erhalten mit die Namen (Layer-Nummern) mit den zweithöchsten Werten?

habe ich versucht, die Lösung in (How to find second highest value and corresponding layer name in a raster stack in R):

m2 <- calc(rs, fun=function(x, na.rm) x[order(x, decreasing=T)[2]]) & calc(rs, fun=function(x, na.rm) order(x, decreasing=T)[2]) 

plot(m2) 

aber ohne Erfolg als plot(m2) zeigt ..

Antwort

1

Hier ist ein Ansatz, um die which.max.na Funktion Modifizieren der zweithöchsten Index zu melden. Beachten Sie, dass ich sum(!is.na(x)) == 1 hinzugefügt habe, damit die Funktion 0 meldet, wenn nur ein Nicht-NA-Wert vorhanden ist.

which.second.max.na <- function(x, ...) 
    ifelse(length(x) == sum(is.na(x)) | sum(!is.na(x)) == 1, 0, 
     which.max(`[<-`(x, which.max(x), NA))) 

m2 <- calc(rs, which.second.max.na) 

Wir können die ersten paar Werte drucken, um zu sehen, ob which.max.na und which.second.max.na arbeiten.

head(values(m1)) 
[1] 2 1 4 2 1 2 

head(values(m2)) 
[1] 4 3 2 1 2 3 

head(values(rs)) 
     layer.1 layer.2 layer.3  layer.4 
[1,] 0.2875775 0.7999890 0.03872603 0.784575267 
[2,] 0.7883051 0.5328235 0.76235894 0.009429905 
[3,] 0.4089769 0.6886130 0.40136573 0.779065883 
[4,] 0.8830174 1.1544738 0.31502973 0.729390652 
[5,] 0.9404673 0.6829024 0.20257334 0.630131853 
[6,] 0.0455565 1.0903502 0.68024654 0.480910830 

Es scheint wie für die ersten sechs Werte aus dem RasterStack funktionieren beide Funktionen wie erwartet.

Schließlich, seien Sie vorsichtig, dass, wenn es in den RasterStack Bindungen gibt, diese beiden Funktionen problematisch sein können.

+0

Es funktioniert perfekt, danke! – Marc

Verwandte Themen