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?
Grüße und schonmal danke!
aufeinanderfolgende gleiche Zahlen zählen
aufeinanderfolgende gleiche Zahlen zählen
- Dateianhänge
-
- stations_days_wrain.csv
- (363.03 KiB) 90-mal heruntergeladen
Re: aufeinanderfolgende gleiche Zahlen zählen
Deine Daten lassen sich gut wie folgt herunterladen:
Und dann finde ich
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:
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:
Hilft das erstmal als Hinweis?
LG,
Bernhard
Code: Alles auswählen
d <- read.csv2("http://forum.r-statistik.de/download/file.php?id=1380")
str(d)
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
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 ...
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
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: aufeinanderfolgende gleiche Zahlen zählen
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!
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!
Re: aufeinanderfolgende gleiche Zahlen zählen
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)
}
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: aufeinanderfolgende gleiche Zahlen zählen
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ß
Bis ich um for-Schleifen herumkomme muss ich noch ganz schön viel dazu lernen und weiter üben...
Lieben Gruß