aufeinanderfolgende gleiche Zahlen zählen

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Antworten
lotti1798
Beiträge: 7
Registriert: Di Feb 02, 2021 7:05 pm

aufeinanderfolgende gleiche Zahlen zählen

Beitrag von lotti1798 »

Hallo zusammen!

Ich würde gerne für den angehängten Datensatz pro Station die Anzahl der Tage herausfinden, an denen hintereinander kein Niederschlag fällt, d.h. Niederschlag Station x =1.

Der Datensatz ist folgendermaßen aufgebaut: Jahr, Monat, Tag, Niederschlagssumme Station 1, Niederschlag Station 1 (ja=0, nein=1), Niederschlagssumme Station 2, Niederschlag Station 2, Niederschlagssumme Station 3, Niederschlag Station 3.

-> Ziel wäre für jede Station eine Matrix: Spalte 1 die Jahre 1960-2020 (es werden nur die extrahierten Monate 5-10 betrachtet), Spalte 2: Ereignis "2 zusammenhängende Tage ohne Niederschlag", Spalte 3: Ereignis "3 zusammenhängende Tage ohne Niederschlag" etc.
Und dann in die Matrix jeweils die Anzahl der Ereignisse pro Jahr
Z.B. 5 Tage hintereinander ohne Regen: Ereignis kommt 1960 2x vor, 1961 5x etc.

Hätte da jemand eine hilfreiche Herangehensweise, wie ich das am sinnvollsten angehen kann? 8-)
Grüße und schonmal danke!
Dateianhänge
stations_days_wrain.csv
(363.03 KiB) 88-mal heruntergeladen
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: aufeinanderfolgende gleiche Zahlen zählen

Beitrag von bigben »

Deine Daten lassen sich gut wie folgt herunterladen:

Code: Alles auswählen

d <- read.csv2("http://forum.r-statistik.de/download/file.php?id=1380")
str(d)
Und dann finde ich

Code: Alles auswählen

> str(d)
'data.frame':	11224 obs. of  10 variables:
 $ X : int  1 2 3 4 5 6 7 8 9 10 ...
 $ V1: int  1960 1960 1960 1960 1960 1960 1960 1960 1960 1960 ...
 $ V2: int  5 5 5 5 5 5 5 5 5 5 ...
 $ V3: int  1 2 3 4 5 6 7 8 9 10 ...
 $ V4: num  0 0 0 0 0 0 0 0 0.1 0 ...
 $ V5: int  1 1 1 1 1 1 1 1 0 1 ...
 $ V6: num  0 0 0 0 0 0 0 0 0 0 ...
 $ V7: int  1 1 1 1 1 1 1 1 1 1 ...
 $ V8: num  0.6 0 0 0 0 0 0 0 3.1 0 ...
 $ V9: int  0 1 1 1 1 1 1 1 0 1 ...
> head(d)
  X   V1 V2 V3 V4 V5 V6 V7  V8 V9
1 1 1960  5  1  0  1  0  1 0.6  0
2 2 1960  5  2  0  1  0  1 0.0  1
3 3 1960  5  3  0  1  0  1 0.0  1
4 4 1960  5  4  0  1  0  1 0.0  1
5 5 1960  5  5  0  1  0  1 0.0  1
6 6 1960  5  6  0  1  0  1 0.0  1
Demnach müsste die Spalte V4 für die erste Messstation stehen. Wonach Du wahrscheinlich primär suchst, ist die Funktion rle. Ein möglicher Aufruf wäre:

Code: Alles auswählen

> rle(d$V4 == 0)
Run Length Encoding
  lengths: int [1:3759] 8 1 2 3 1 1 1 5 1 1 ...
  values : logi [1:3759] TRUE FALSE TRUE FALSE TRUE FALSE ...
Das bedeutet, es gab erst 8 Tage am Stück Trockenheit, dann einen Tag mit Niederschlag, dann 2 Tage mit Trockenheit und dann 3 Tage mit Niederschlag und dann 1 ohne usw.

Da uns die Werte mit Niederschlag ja nicht interessieren, extrahieren wir nur die Werte ohne NIederschlag:

Code: Alles auswählen

a <- rle(d$V4 == 0)
a <- a$length[a$values]
max(a)

Hilft das erstmal als Hinweis?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
lotti1798
Beiträge: 7
Registriert: Di Feb 02, 2021 7:05 pm

Re: aufeinanderfolgende gleiche Zahlen zählen

Beitrag von lotti1798 »

Hallo Bernhard!

Das hilft auf jeden Fall schonmal ein ganzen Stückchen weiter, danke dir!

Mein Problem ist jetzt eigentlich nur noch dass ich den Vektor a gerne auf ein Jahr beziehen würde, sodass ich Aussagen darüber machen kann, wie oft es 2 Tage Trockenheit gab in einem Jahr...

Also vielleicht kann man mit einer for-Schleife pro Jahr jeweils einen Vektor ausgeben lassen, in dem die Werte von Vektor a drin stehen für das jeweilige Jahr?

Liebe Grüße und vielen Dank dir für die Hilfe!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: aufeinanderfolgende gleiche Zahlen zählen

Beitrag von bigben »

lotti1798 hat geschrieben: Fr Feb 26, 2021 1:07 pmMein Problem ist jetzt eigentlich nur noch dass ich den Vektor a gerne auf ein Jahr beziehen würde, sodass ich Aussagen darüber machen kann, wie oft es 2 Tage Trockenheit gab in einem Jahr...
Machen wir zunächst drei Optimierungen an meinem alten Code. Erstens brauche ich nicht zu suchen, wann V4 ==0 ist, denn dafür gibt es ja schon die Spalte V5. Zweitens nutzen wir jetzt die Funktion table, die uns eine Häufigkeitstabelle erstellt, so dass wir einfach ablesen können, wie oft es zwei, drei, vier oder zwanzig Tage am Stück trocken war. Und zuguterletzt packen wir das Ganze in eine Funktion. Könnte dann im nächsten Schritt so aussehen:

Code: Alles auswählen

d <- read.csv2("http://forum.r-statistik.de/download/file.php?id=1380")
str(d)

trocken.verteilung <- function(spalte){
    a <- rle(spalte)
    a <- a$lengths[a$values == 1]
    return(table(a))
}
Also vielleicht kann man mit einer for-Schleife pro Jahr jeweils


for-Schleifen sind im Forum nicht so gern gesehen, weil sie selten optimal sind. Sie sind aber anfängerfreundlich, also können wir eine for-Schleife schreiben, in der jeweils für ein Jahr und eine Messstation die Verteilung der Tage abgerufen wird:

Code: Alles auswählen

jahre <- unique(d$V1)
for(jahr in jahre){
  cat("\n analysiere das Jahr ")
  cat(jahr)
  cat("\n")
  verteilung <- trocken.verteilung(d$V5[d$V1==jahr])
  plot(verteilung, main = paste("V5 == 1 in ", jahr))
  print(verteilung)
}
Kommst Du damit weiter?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
lotti1798
Beiträge: 7
Registriert: Di Feb 02, 2021 7:05 pm

Re: aufeinanderfolgende gleiche Zahlen zählen

Beitrag von lotti1798 »

Wow, einfach nur ein dickes Dankeschön!

Bis ich um for-Schleifen herumkomme muss ich noch ganz schön viel dazu lernen und weiter üben... ;)
Lieben Gruß
Antworten