Umcodierung in Formal class Rasterlayer

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
RSAGA_Fan
Beiträge: 6
Registriert: So Dez 02, 2018 9:12 pm

Umcodierung in Formal class Rasterlayer

Beitrag von RSAGA_Fan »

Hallo Community,

Ich hänge seit Tagen an einem Problem, probiere immer wieder neue Befehle aus, stehe aber mittlerweile am Ende und hoffe, dass ihr euch vielleicht mal kurz meines Problems annehmt :)

(ich bin leider kein großes R-Ass, bin aber gerade dabei es zu lernen, um zukünftig weiter damit arbeiten zu können, daher verzeiht mir bitte meine evtl. falsche Begriffswahl)

Ich habe 10 .asc Dateien (die ich normalerweise in GIS-Programmen zur Visualisierung (SAGA oder ArcMap) öffne und bearbeite.

In diesen Dateien möchte ich den vorgegebenen Code ändern, der den einzelnen Rasterzellen sagt, welche Information dahinter steht (Grad der Oberflächen-Schneebedeckung). Es gibt die zahlen „0“, „1“, „11“, „37“, „100“ etc. aber mich interessieren nur „25“ und „200“, die mir sagen „kein Schnee“, bzw. „Schnee“. Alles andere sagt mir nur „no data“ und ist für mich uninteressant.
Daher möchte ich diese Werte ändern. Den Wert „25“ in den Wert „1“ und den Wert „200“ in „2“. Alles andere möchte ich mit „0“.

Eingelesen habe ich die Dateien mit:

Code: Alles auswählen

Tag15_01     <- raster("Outputs/Ascis/A2015001.asc") 
Tag15_02     <- raster("Outputs/Ascis/A2015002.asc")  
Tag15_03     <- raster("Outputs/Ascis/A2015003.asc")                          
Tag15_04     <- raster("Outputs/Ascis/A2015003.asc")
...
Habe ich da evtl. schon einen Fehler, da ich so nicht weiter damit arbeiten kann?
Bei str(Tag15_01) kommen dann diese Infos (In der Environment unter Values, betitelt mit „Formal class Raterlayer“):

Code: Alles auswählen

> str(Tag15_01)
Formal class 'RasterLayer' [package "raster"] with 12 slots
  ..@ file    :Formal class '.RasterFile' [package "raster"] with 13 slots
  .. .. ..@ name        : chr "/Volumes/USB DISK/RSoSe18/R3/Daten/WD_HA/Outputs/Ascis/ A2015001.asc"
  .. .. ..@ datanotation: chr "FLT4S"
  .. .. ..@ byteorder   : chr "little"
  .. .. ..@ nodatavalue : num 255
  .. .. ..@ NAchanged   : logi FALSE
  .. .. ..@ nbands      : int 1
  .. .. ..@ bandorder   : chr "BIL"
  .. .. ..@ offset      : int 6
  .. .. ..@ toptobottom : logi TRUE
  .. .. ..@ blockrows   : int 0
  .. .. ..@ blockcols   : int 0
  .. .. ..@ driver      : chr "ascii"
  .. .. ..@ open        : logi FALSE
  ..@ data    :Formal class '.SingleLayerData' [package "raster"] with 13 slots
  .. .. ..@ values    : logi(0) 
  .. .. ..@ offset    : num 0
  .. .. ..@ gain      : num 1
  .. .. ..@ inmemory  : logi FALSE
  .. .. ..@ fromdisk  : logi TRUE
  .. .. ..@ isfactor  : logi FALSE
  .. .. ..@ attributes: list()
  .. .. ..@ haveminmax: logi FALSE
  .. .. ..@ min       : num Inf
  .. .. ..@ max       : num -Inf
  .. .. ..@ band      : int 1
  .. .. ..@ unit      : chr ""
  .. .. ..@ names     : chr ""
  ..@ legend  :Formal class '.RasterLegend' [package "raster"] with 5 slots
  .. .. ..@ type      : chr(0) 
  .. .. ..@ values    : logi(0) 
  .. .. ..@ color     : logi(0) 
  .. .. ..@ names     : logi(0) 
  .. .. ..@ colortable: logi(0) 
  ..@ title   : chr(0) 
  ..@ extent  :Formal class 'Extent' [package "raster"] with 4 slots
  .. .. ..@ xmin: num 410722
  .. .. ..@ xmax: num 469563
  .. .. ..@ ymin: num 3065488
  .. .. ..@ ymax: num 3106260
  ..@ rotated : logi FALSE
  ..@ rotation:Formal class '.Rotation' [package "raster"] with 2 slots
  .. .. ..@ geotrans: num(0) 
  .. .. ..@ transfun:function ()  
  ..@ ncols   : int 127
  ..@ nrows   : int 88
  ..@ crs     :Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr NA
  ..@ history : list()
  ..@ z       : list()

Dann habe ich es auch mit einlesen über folgenden Codes versucht:
1.

Code: Alles auswählen

Tag15_01_2     <- read.table("/Volumes/USB DISK/RSose18/R3/Daten/WD_HA/Outputs/Ascis/MOD10A1_A2015001_h25v06_005_2015006011548.asc", header=TRUE, sep=' ')
schaffe ich es aber auch nicht. Da kommt die Fehlermeldung:
„Fehler in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
Zeile 6 hatte keine 2 Elemente“
2.

Code: Alles auswählen

Tag15_01 <-  paste(system.file(package = "adehabitat"),
               "Outputs/Ascis/A2015001.asc", sep = " ")
T01 <- import.asc(Tag15_01) 
Aber das scheiterte schon daran, dass R trotz Installation des package „spgrass6“ die Funktion import.asc nicht findet.


Aber vielleicht ist das auch egal, und ich könnte es auch mit der Funktion raster() weiter bearbeiten, mit der es ja geklappt hat.

Folgende Versuche habe ich dann unternommen, um den Code zu ändern:

1.

Code: Alles auswählen

recode()
recode(Tag15_01, "50"="0", as.numeric=TRUE)
recode(Tag15_01,`25` = "1", `200` = "2", `else` = "0")
recode(Tag15_01, "c(0,1,11,37,39,50,100,254)='0'; 25='1'; 200='2")
2.

Code: Alles auswählen

Tag15_06@data[Tag15_06@data==50]<-0
3.

Code: Alles auswählen

Tag1 <- replace(Tag15_01, Tag15_01 == "50", "0")
# Fehlermeldung: Vergleich (1) ist nur für atomare und Listentypen möglich
4.

Code: Alles auswählen

Tag1 <- lapply(Tag15_01, function(x) ifelse(x=="50", "0", x))
Mit nichts bekomme ich das hin...

Die Umkodierung benötige ich, damit ich im Folgenden (vor allem auch, wenn ich alle .asc-Dateien zusammengefügt habe) den Tag mit der höchsten Schneebedeckung herausfinden kann und einen Regression Tree zur Veranschaulichung erstellen kann.


Über Hilfe wäre ich sehr sehr dankbar! Da ich vor Fehlermeldungen schon ganz eRschöpft bin ... ;)
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von EDi »

Da kein reproduzierbares Beispiel mitgelifert wurde, habe ich selbst ein gemacht.

Code: Alles auswählen

# make a reproducible example
library(raster)
r <- raster(nrows = 10, ncol = 10)
set.seed(123)
r[] <- sample(c(25, 250, 23), size = 100, replace = TRUE)
plot(r)

# recode 25 => 1, 250 => 2, else 0
r[!r %in% c(25, 250)] <- 0
r[r == 25] <- 1
r[r == 250] <- 2

plot(r)
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.
RSAGA_Fan
Beiträge: 6
Registriert: So Dez 02, 2018 9:12 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von RSAGA_Fan »

Oh vielen Dank! Es hat geklappt :D

Eben habe ich erst entdeckt, dass ich Dateien hätte anhängen können. Aber vielen Dank auch für das Erstellen eines vergleichbaren Datensatzes deinerseits.

Könntest du, oder jemand anderes, mir eventuell auch noch bei meinem Folgeproblem helfen?
Ich möchte nun anhand dieser Codierung in diesen .asc'is, die jeweils für einen Tag stehen, den Tag mit der höchtsten Häufigkeit des Wertes "2" ermitteln, also den Tag mit der Prozentual höchsten Schneebeckung.
Häufigkeiten anhand einer Spaltenbezeichnung könnte man ja so machen:
prop.table(Tag15_01("Spaltenbezeichnung")*100
Bloß habe ich ja keine wirklich Spaltenbezeichnung, sondern möchte alle Werte in der Matrix dort mit einbeziehen.

Die Werte sehen ja so aus:
> head(Tag15_01)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
5 0 0 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0
6 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
7 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 2 2 0 0 0
8 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 2 2 0 2
9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2
10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2

Mag mir jemand sagen, wie ich das auswählen kann?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von EDi »

Mit

Code: Alles auswählen

sum(r == 2)
dürftest du die Häufigkeit bekommen (nicht getestet, ich ich derzeit kein R Zugang habe).

Dann einfach über die Raster damit drüberlaufen

Code: Alles auswählen

sapply(<listofrasters>, function(x) sum(x == 2)) 
Das gibt dir die Häufigkeiten für jeden Raster in der Liste.
Daraus bekommt man dann einfach mit which.max() die position des Maximums.

Ich bin mir auch sicher, dass es mit rasterStacks funktioniert.
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.
RSAGA_Fan
Beiträge: 6
Registriert: So Dez 02, 2018 9:12 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von RSAGA_Fan »

Wieder einmal Danke für die schnelle Antwort ^-^

Wenn ich das so ausprobiere:
sum(Tag15_04 == 2)
sapply(Tag15_04, function(x) sum(x == 2))
which.max(2)
getOption("max.print")

Kommt leider diese Warnung in der Console ...
> sum(Tag15_04 == 2)
class : RasterLayer
dimensions : 88, 127, 11176 (nrow, ncol, ncell)
resolution : 463.3127, 463.3127 (x, y)
extent : 410722.3, 469563, 3065488, 3106260 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : in memory
names : layer
values : 0, 1 (min, max)

Warning message:
In sum(new("RasterLayer", file = new(".RasterFile", name = "", datanotation = "LOG1S", :
Nothing to summarize if you provide a single RasterLayer; see cellStats
> sapply(Tag15_04, function(x) sum(x == 2))
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0
[44] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0
[87] 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[130] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[173] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
[216] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[259] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[302] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[345] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[388] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[431] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[474] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[517] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[560] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[603] 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[646] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[689] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[732] 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[775] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[818] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[861] 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[904] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[947] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[990] 0 0 0 0 0 0 0 0 0 0 0
[ reached getOption("max.print") -- omitted 10176 entries ]
> which.max(2)
[1] 1
> getOption("max.print")
[1] 1000

Liegt es am Datenformat?
Oder verstehe ich nur nicht was R mir da herausgibt...

Ich wollte mal 3 der .asc-Dateien, mit denen ich arbeite, anhängen, das geht aber leider nicht...
Kann ich dir die mal per Mail schicken oder hast du so schon eine Lösung?
Ich habe den Inhalt der .asc Dateien mal einfach in eine normale Excel-Tabelle überführt.
Dateianhänge
ASC-Dateien fuer Forum R-Statistik.xlsx
(15.74 KiB) 33-mal heruntergeladen
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von EDi »

Dann probier mal

Code: Alles auswählen

cellStats(r == 2, 'sum')
Problem ist das sum() dir ein RasterLayer und kein skalar zurück gibt. Dafür gibt's cellStats.

Immer nach jedem Schritt prüfen, ob das Ergebnis deinem Erwartungen entspricht...
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.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von EDi »

Hier nochmal als reproduzierbares Beispiel:

Code: Alles auswählen

# make a reproducible example
library(raster)
r <- raster(nrows = 10, ncol = 10)
set.seed(123)
r[] <- sample(c(25, 250, 23), size = 100, replace = TRUE)
plot(r)

# recode 25 => 1, 250 => 2, else 0
r[!r %in% c(25, 250)] <- 0
r[r == 25] <- 1
r[r == 250] <- 2

plot(r)

### create stack of rasters
s <- stack(r, r)
# count number of cells with 2 for each 
cellStats(s == 2, sum)
Beachte, dass ich die verschiedenen Raster zu einem RasterStack zusammenfüge. cellStats gibt dann einen Werte pro layer zurück.
Man kann sie auch in eine Liste packen und mir sapply() drüberlaufen...
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.
RSAGA_Fan
Beiträge: 6
Registriert: So Dez 02, 2018 9:12 pm

Re: Umcodierung in Formal class Rasterlayer

Beitrag von RSAGA_Fan »

Vielen Dank!
Das hat geklappt :D
Antworten