Zuweisung von Werten mit if und while

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Zuweisung von Werten mit if und while

Beitrag von jessi »

Hallo zusammen,

derzeit beschäftige ich mich mit dem Kombinieren von Rasterfiles und der Zuweisung von Werten unter bestimmten Bedingungen. Ich habe ein Rasterfile (pre), welches Niederschlag (in Form von Klassen) enthält und ein Rasterfile (h), welches die Seehöhe enthält. Jetzt möchte ich, dass Abhängig vom Breitengrad jeder Seehöhe eine Niederschlagswahrscheinlichkeit zugeordnet wird - beispielsweise zwischen dem Breitengrad 48.5 und 49.5 liegt bei einer Seehöhe von 1300 m die Niederschlagswahrscheinlichkeit bei 2.

Ohne die Breitengrad-Abhängigkeit zu berücksichtigen habe ich die Zuordnung mit 'overlay' gemacht:

Code: Alles auswählen

# erstelle Zufalls-Raster für Niederschlagsklassen
pre <- raster()
pre[] <- runif(ncell(pre), min = 0, max = 195)


# erstelle Zufalls-Raster für Seehöhen
h <- raster()
h[] <- runif(ncell(h), min = 0, max = 4579)

#definiere die Funktion zum Zuordnen der Wahrscheinlichkeiten, in Abhängigkeit der Niederschlagsklassen und Seehöhe
fun_if <- function(x,y){
ifelse( x == 4 & y >= 300 & y <= 599, 2, 
 ifelse( x == 4 & y >= 600 & y <= 899, 2, 

ifelse( x == 19 & y >= 300 & y <= 599, 3, 
ifelse( x == 19 & y >= 600 & y <= 899, 3, 

ifelse( x == 10 & y >= 300 & y <= 599, 1, 
 ifelse( x == 10 & y >= 600 & y <= 899, 2, 

ifelse( x == 17 & y >= 300 & y <= 599 | x == 13 & y >= 300 & y <= 599 | x == 60 & y >= 300 & y <= 599, 2, 
 ifelse( x == 17 & y >= 600 & y <= 899 | x == 13 & y >= 600 & y <= 899 | x == 60 & y >= 600 & y <= 899, 2, 
ifelse (x == 111 | x == 180 | x == 178 | x == 192, 0, 
 ifelse (y > 1500, 0,

     NA )) )) )) )))) }

p_prec <- overlay(pre, h, fun = fun_if)


In dem neuen Rasterfile p_prec stehen jetzt die jeweiligen Wahrscheinlichkeiten von Niederschlag.

Allerdings unterscheiden sich diese je nach Lage. Die Funktion fun_if ist in meinem Fall abhängig vom Breitengrad, hauptsächlich wird sich die letzte ifelse-Bedingung (y > 1500,0) ändern. Da es sich eigentlich um flüssigen Niederschlag handelt, nimmt nach Norden hin die Höhe, in der der Niederschlag flüssig auftritt, ab. Dies möchte ich im Rasterfile p_prec (bzw. mit der entsprechenden Graphik) zeigen.

Ich dachte, ich löse das Problem mit einer while oder repeat Schleife, wobei ich hier nicht weiß, wie ich das am besten umsetzten soll.

Das Auslesen der Koordinaten habe ich mit init probiert:

Code: Alles auswählen

lat <- init(h,'y')
v_lat <- values(lat_h)
Da die Rasterfiles alle in WGS84-Koord. sind, dürfte dieser Schritt ja kein Problem beim richten Zuordnen sein. Ich denke aber, dass ich mit dieser Information nur wenig anfangen kann, weil die Abfrage der Koordinaten doch eigentlich direkt erfolgen sollte? Beim Ausführen des repeat-Befehlen habe ich ja eigentlichen keinen Bezug zu den jeweiligen Koordinaten, oder verstehe ich das nicht richtig? Leider fand ich auch keine Infos gefunden, wie ich direkt auf lat/long zugreife, ohne diese extra in einer neuen Variable zu speichern. Probiert habe ich dann noch folgendes (was wie befürchtet auch leider nicht den gewünschten erfolgt brachte:

Code: Alles auswählen

# geänderte Funktion für die Breitengrade ab 60°
fun_if_1 <- function(x,y){
ifelse( x == 4 & y >= 300 & y <= 599, 2, 

ifelse( x == 19 & y >= 300 & y <= 599, 3, 

ifelse( x == 10 & y >= 300 & y <= 599, 1, 

ifelse( x == 17 & y >= 300 & y <= 599 | x == 13 & y >= 300 & y <= 599 | x == 60 & y >= 300 & y <= 599, 2, 
ifelse (y >= 600, 0,

     NA )) )) )}

repeat {
p_prec <- overlay(pre,h, fun = fun_if_1)
if (v_lat > 60) break
# if (v_lat > 60 & v_lat <= 65)

Warnmeldung:
In if (v_lat > 60) break :
  Bedingung hat Länge > 1 und nur das erste Element wird benutzt
}

Leider funktioniert der repeat-Befehl nicht.
Da ich den repeat-Befehl auch für mehrere unterschiedliche Bedingungen (je nach Breitengrad) ausführen muss, überschreibe ich mir die bereits erstellte p_prec oder werden die entsprechenden Breitengrade mit den neuen Informationen ergänzt. Wieviele solcher fun_ifs ich am Ende haben werde, kann ich derzeit noch nicht sagen, da ich mir die Information noch aus der Literatur suchen muss. Ich wollte vorab mal Probieren, ob ich diesen Ansatz in R umsetzten kann.

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt und bin sehr dankbar für eure Hilfe.

Gruß, Jess
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zuweisung von Werten mit if und while

Beitrag von EDi »

Allerdings unterscheiden sich diese je nach Lage. Die Funktion fun_if ist in meinem Fall abhängig vom Breitengrad, hauptsächlich wird sich die letzte ifelse-Bedingung (y > 1500,0) ändern. Da es sich eigentlich um flüssigen Niederschlag handelt, nimmt nach Norden hin die Höhe, in der der Niederschlag flüssig auftritt, ab. Dies möchte ich im Rasterfile p_prec (bzw. mit der entsprechenden Graphik) zeigen.
Kannst du nicht Gradienten auf die Höhe legen? Also einfach mit einem anderen raster multiplizieren, welche deine breitengrad abhängigkeit zeigt?


Du du sollest deine vielen Bedinungen auch überprüfen, ob sie wirklich das richtige tun. Auch glaub ich das man die vereinfachen kann:
Ist

Code: Alles auswählen

  ifelse( x == 4 & y >= 300 & y <= 599, 2, 
          ifelse( x == 4 & y >= 600 & y <= 899, 2, ...
Nicht das gleiche wie:

Code: Alles auswählen

  ifelse( x == 4 & y >= 300 & y <= 899, 2, ... 
:?: Vielleicht ist es aber auch schonzu spät für mich...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Zuweisung von Werten mit if und while

Beitrag von jessi »

Hallo EDI,

vielen Dank für deinen Beitrag und sorry für die späte Antwort.
Ich habe jetzt meine if-Bedingungen überarbeitet und zusammengefasst. Danke für deine Anmerkung.

Grüße
jess
Antworten