Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Alles zum Thema der beschreibenden Statistik

Moderator: jogo

SchroedingersCat
Beiträge: 5
Registriert: Sa Feb 20, 2021 7:57 pm

Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von SchroedingersCat »

Liebe Alle,

ich bin neu bei euch im Forum, deshalb vielleicht ein paar kurze Worte zu meiner Situation:

Ich habe B.Sc. Umweltwissenschaften studiert und habe zur Umweltsystemmodellierung und statistischen Auswertung R gelernt und es lief an der Uni eigentlich ganz gut. R ist eine coole Freeware, mit der man einiges machen kann. Jetzt habe ich einen HiWi Job, wobei ich unteranderem meteorologische Daten auswerten muss und merke, dass ich auch nach stundenlangem Durchwühlen von Unterlagen und Online-Foren nicht ein mal die einfachsten Dinge hinkriege. Ich verlange von euch natürlich keinen R Code oder Lösungen, sondern hoffe, dass mir jemand gedanklich auf die Sprünge helfen kann...


-Meine Aufgabe:
z.B. die täglichen Min. und Max. Werte aus Klima-Datensätzen (32 Plots) berechnen, welche meist im 30-minütigem Intervall gemessen wurden.

-Mein Datensatz:
Ich habe pro Parameter (Temperatur [T], Luftfeuchte [Rh]…) einen data.frame mit den Variablen: Datum, Zeit und 32 Plots (Messstationen) erstellt. Bei einem Aufzeichnungszeitraum von 1 Jahr und 48 Messungen pro Tag sind das pro Parameter bereits ~ 500k Daten, weshalb das ganze nicht manuell sondern nur mit sinnvollen Funktionen klappen kann.

-Bislang:
Habe ich eigentlich nur den Datensatz von Fehlern bereinigt, mit as.date() das Datum konvertiert und mir überlegt, wie ich es mit "for" oder "if" Schleifen schaffe, dass aus den 30-minütigen Daten von 32 Plots, täglich das Maximum und Minimum berechnen kann aber kriege es nicht ansatzweiße auf die Reihe.


Könnt ihr mir bei dem Thema mit Ansatzmöglichkeiten, Beispielen oder mit Literatur irgendwie auf die Sprünge helfen?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von EDi »

Ich habe B.Sc. Umweltwissenschaften studiert
Cool, so einen hab ich auch :)


Ich habe hier mal die vielen Möglichkeiten dargestellt.

Ich würde dir aber zu dplyr oder data.table raten (andere hier würden dir zu ave() raten). dplyr ist recht zugänglich, data.table unglaublich schnell.

Zu beiden findest du genügend Infos im Netz. Wenn nicht liefer uns ein reproduzierbares Beispiel und wir helfen gerne.

Von wie vielen Datensätzen/Zeilen reden wir hier?
Wenn's in die Millionen geht ist data.table unschlagbar.

if Schleifen gibt es nicht und for-Schleifen kann man zwar dafür nutzen ist aber umständlich und vermutlich nicht wirklich effizient. Dafür gibt's in R bessere Funktionen (siehe Link oben).
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.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von bigben »

@EDi: Wow! 162 upvotes im schnellebigen stackoverflow. Das ist beachtlich. Gut gemacht.

@SchroedingersCat:
Ich verlange von euch natürlich keinen R Code oder Lösungen, sondern hoffe, dass mir jemand gedanklich auf die Sprünge helfen kann...
Das ist im Grunde eine gute Einstellung, aber sehr oft ist es halt so, dass sich Gedanken am besten durch Code ausdrücken lassen. Und Syntaxfehler kann man ohnehin nur mit Code finden/beseitigen. Am nützlichsten ist Code dann, wenn er an die eigene Datenstruktur angepasst ist und deshalb wäre es ein erster sehr sinnvoller Schritt, wenn Du uns ein repräsentatives Beispiel Deiner Daten zur Verfügung stellen könntest. Viele sehr gute Hinweise dazu hat EDi hier zusammengefasst: viewtopic.php?f=20&t=11 Damit sind nicht die 500k gemeint, aber durchaus ein Ausschnitt, in dem mehrere verschiedene Tage vorkommen.
Die ersten 3*48 Zeilen eines Datensatzes könntest Du zum Beispiel so ausschneiden:

Code: Alles auswählen

head(data_table_name, 3 * 48)
An drei Tagen kann man schon vormachen, wie man Durchschnitte aus den Tagen bildet. Wir brauchen auch nicht alle 32 Plots, aber halt mehrere, um vorzumachen, wie man mit mehreren umgeht.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von Athomas »

Ich würde dir aber zu dplyr oder data.table raten
Ich würde Dir auch zu data.table raten, das ist - wenn denn die Daten erst mal in einer geeigneten Form vorliegen - ein Einzeiler!
Die Berechnungen werden so fix gehen, dass Du anfangs an einen Fehler glauben wirst :D ...

Gibt es einen Grund, dass Du die "Parameter" in eigenen Dataframes ablegst? Wenn die irgendwann eine ähnliche Behandlung erfahren sollen, könnte das ja hinderlich sein!?
SchroedingersCat
Beiträge: 5
Registriert: Sa Feb 20, 2021 7:57 pm

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von SchroedingersCat »

Vielen Dank für die vielen Antworten und guten Tipps!

Dass ich zu unfähig für diese einfache Berechnung war, liegt wohl daran, dass ich in der Uni echt nur Basics gelernt habe und noch nie mit dplyr und pipes gearbeitet habe -mir haben schlicht die packages und Befehle gefehlt. Mit schleifen würde ich wahrscheinlich noch nächste Woche dran sitzen :D Mit euren Empfehlungen und ein bisschen ausprobieren habe ich folgendes geschafft:

Code: Alles auswählen

Rh_AV_Karotte_max_min <- Rh_AVV_Kartoffel %>% 
as_tibble(.) %>%                                                                         
mutate(day = day(ï..Datum), month = month(ï..Datum)) %>%                              
melt(., id.vars = c("day", "month"), measure.vars = c("APV17", "APV18", "APV20")) %>%   
group_by(month, day) %>%                                                                 
summarise(., min = min(value, na.rm = T), max = max(value, na.rm = TRUE))
Ich würde Dir auch zu data.table raten, das ist - wenn denn die Daten erst mal in einer geeigneten Form vorliegen
Ich habe es mit dplyr versucht, weil ich in diesen Verkettungen einfach einen Mehrwert gesehen habe und es zum Datenverarbeiten super hilfreich zu sein scheint. Aber es war schon etwas gedauert, gerade weil ich darin noch nicht so fit bin. Würdest du mir trotzdem empfehlen, es über data.table zu versuchen bzw. ist es immer noch so viel schneller (oder einfacher?), wenn ich trotzdem zunächst die Daten in geeignete Form bringen muss?
Von wie vielen Datensätzen/Zeilen reden wir hier?

Gibt es einen Grund, dass Du die "Parameter" in eigenen Dataframes ablegst?
Ja, denn ich habe immer 4 Plots mit Messtationen pro Fläche. Aus diesen möchte ich die Evapotranspiration berechnen und vergleichen. Daher wollte ich die Datensetzte von Beginn an in einzelnen dataframes speichern. Oder würdest du sagen, es macht trotzdem Sinn zunächst mit einem Dataframe pro "Parameter" zu rechnen und dann z.B. mit ][ darauf zuzugreifen?
Insgesamt sind es 4 Flächen mit 4 gemessenen Klima-Parametern über 1 Jahr hinweg. Hier ein Ausschnitt:

Code: Alles auswählen

 ï..Datum  Zeit AV17 AP18 AV19 AV20
1   2018-01-01 00:00 82.37 76.95 77,55 79.19
2   2018-01-01 00:30 82.37 78.06 78,64 78.64
3   2018-01-01 01:00 83.44 78.61 79,19 79.19
4   2018-01-01 01:30 81.65 77.56 78,08 78.08
5   2018-01-01 02:00 85.69 78.64 79,73 78.62
6   2018-01-01 02:30 86.06 78.64 80,79 80.19
...
[ reached 'max' / getOption("max.print") -- omitted 17354 rows ]

Danke für die Hilfe! LG
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von EDi »

. Oder würdest du sagen, es macht trotzdem Sinn zunächst mit einem Dataframe pro "Parameter" zu rechnen und dann z.B. mit ][ darauf zuzugreifen?
Ich würde die Daten immer zusammenhalten, machts einfacher und lesbarer.


Würdest du mir trotzdem empfehlen, es über data.table zu versuchen bzw. ist es immer noch so viel schneller (oder einfacher?),
Sieht doch gut aus [Gut am Code-Style kann man noch arbeiten (T vs True, Die . kann man weglassen)]. Da du nur wenig Daten hast (20k) und du mit dplyr anscheinend gut klar kommst - bleib doch dabei.
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.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von bigben »

Hallo SchroedingersCat,

das Thema mit dplyr versus data.table kann Gemüter ganz unerwartet erhitzen. Es gibt da echte Fanboys auf beiden Seiten. Hier im Forum bleibt die Diskussion gottseidank sachlich und auf dem Teppich. Als jemand, der sich keinem System verschrieben hat, schreib ich meine Meinung -- eine Meinung ohne Anspruch auf Gültigkeit für andere.
SchroedingersCat hat geschrieben: So Feb 21, 2021 7:26 pm Mit schleifen würde ich wahrscheinlich noch nächste Woche dran sitzen :D
Ein Jahr mit 48 Beobachtungen pro Tag sind soviel nicht. Da könnte man vieles auch noch mit Schleifen machen, es ist aber unbestritten, dass das nicht der Weg ist, den Du einschlagen solltest.
trotzdem empfehlen, es über data.table zu versuchen bzw. ist es immer noch so viel schneller (oder einfacher?)
Wenn wir ein Wettrennen machen, dann wird data.table gewinnen. Das kann und soll aber nicht das einzige Kriterium sein. Datatable ist toll, wenn man die wohlformulierte Kurzschreibweise mit Formelzeichen schätzt. Oft macht eine kurze Zeile in data.table das, was fünf oder sechs lange Zeilen in dplyr machen. Was von beidem dann einfacher ist, ist Geschmackssache. Der eine wird es toll finden, dass die ganzen Befehle in dplyr ausgeschriebene englische Vokabeln sind die die Aufgabe in einer Reihenfolge beschreiben, die einer menschlichen Beschreibung entsprächen. Den anderen schüttelt es, wieviele Vokabeln man dafür lernen muss und findet es viel eleganter, dasselbe Problem mit wenigen Tastenanschlägen zu formulieren, dabei Listen einfach mit einem Punkt "." zu erstellen und auf die Reihenfolge der Zeichen zu achten. Der eine findet das eine einfach zu lesen, weil es dem Englischen nahe sein soll, der andere findet, dass ein Fehler dann am besten heraussticht, wenn es nur wenige Stellen gibt, an denen der Fehler sich verstecken könnte.
Data.table versucht die eine Nische, nämlich das Sortieren, Zusammenfassen, Anordnen und Heraussuchen von Daten perfekt zu gestalten. dplyr versteht sich als Teil eines umfassenden Reformationsansatzes, der den ganzen Prozess der Datenanalyse systematisieren will. data.table ist es egal, wie man einen t-Test rechnet. Das ist in R bereits gelöst. Ich habe immer geunkt, dass die tidyverse-Fans irgendwann auch noch den t-Test neu erfinden - violà, da ist der tidy-t-Test: https://cran.r-project.org/web/packages ... _test.html

Die Quintessenz ist: Du kannst alle Aufgaben ohne eines der Systeme, mit dplyr oder mit data.table lösen. Für alle drei Varianten erhälst Du Hilfe vom Forum, wahrscheinlich aber von verschiedenen Personen. Unser EDi mischt auch die Systeme je nach der Aufgabe die vor ihm liegt, aber für Dich gibt es keinen Grund, drei Lösungswege für jedes Problem zu lernen. Investiere vier Stunden, Dir dplyr anzuschauen, investiere 4 Stunden, um Dir data.table anzuschauen und dann entscheide Dich zwischen diesen beiden und bleib erstmal dabei. Du machst mit beiden nichts falsch.

Viel Erfolg,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von bigben »

Zweiter Beitrag von mir, ganz andere Richtung.

Deine Beispieldaten sind ja nun sehr knapp, außerdem passen die Spaltennamen in den Beispieldaten nicht zu dem Beispielcode.
So wäre es ein reproduzierbares Beispiel:

Code: Alles auswählen

Rh_AVV_Kartoffel <- read.table(header = TRUE, text ="Datum  Zeit APV17 APV18 APV19 APV20
1   2018-01-01 00:00 82.37 76.95 77.55 79.19
2   2018-01-01 00:30 82.37 78.06 78.64 78.64
3   2018-01-01 01:00 83.44 78.61 79.19 79.19
4   2018-01-01 01:30 81.65 77.56 78.08 78.08
5   2018-01-01 02:00 85.69 78.64 79.73 78.62
6   2018-01-01 02:30 86.06 78.64 80.79 80.19")
Rh_AVV_Kartoffel$Datum <- as.Date(Rh_AVV_Kartoffel$Datum)
Ich kann es nicht ganz lassen, daran herumzubasteln. Hier in etwa Deine Version (angepasst, leicht eingekürzt, passende Variablennamen,...):

Code: Alles auswählen

library(dplyr)
library(lubridate)
Rh_AVV_Kartoffel %>% 
  mutate(day = day(Datum), month = month(Datum)) %>%                              
  reshape2::melt(id.vars = c("day", "month"), measure.vars = c("APV17", "APV18", "APV19", "APV20")) %>%   
  group_by(month, day) %>%                                                                 
  summarise(min = min(value, na.rm = T), max = max(value, na.rm = TRUE))
Die Alternative wäre natürlich nicht, irgendwelche Schleifen zu programmieren. Nicht identisch, für die Daten eines Jahres aber entsprechend, könnte man ohne irgendwelche library-Aufrufe folgendes tun:

Code: Alles auswählen

longdata <- reshape(Rh_AVV_Kartoffel, varying = c("APV17", "APV18", "APV19", "APV20"), 
                    direction = "long", v.names = "APV")
aggregate(APV ~ Datum, data = longdata, range, na.rm = TRUE)
Ob einem das jetzt gefällt, welches schöner, leichter zu merken, leichter zu debuggen ist: chacun à son gout. Klar ist, Schleifen sind da keine drin. Was ich mir wünschen würde: Lass doch mal beides über einen Originaldatensatz laufen und sag uns, ob das einen Laufzeitunterschied macht, der wirklich fühlbar (nicht nur messbar, sondern fühlbar) ist.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von Athomas »

chacun à son gout
Jaja, genau! Cancun wäre jetzt super :lol: !

Hier noch was Verwertbares, ein Vergleich von data.table und dplyr: https://atrebas.github.io/post/2019-03- ... ble-dplyr/
Aber Vorsicht: der Autor outet sich im letzten Abschnitt (wie hinterhältig!) als data.table-Fan...
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Tägliche Berechnungen von 30-minütigen Messungen mehrerer Plots

Beitrag von bigben »

Mit Cancun kann man sich ganz schön in die Nesseln setzen. So wie jetzt der Senats-Abgeordnete von Texas, der bei Kälteeinbruch und Elektrizitätsausfall seinen Staat Richtung warmes Cancun verlassen hat, was ihm keine tolle Presse eingebracht hat.

Wenn wir jetzt schon in einen dplyr versus data.table Thread hineinrutschen gehört das folgende m. M. n. auch zu den besseren Entscheidungsgründen. Zitiert aus einem Blog gegen das tidyverse aber für sich zunächst mal wertfrei zu lesen:
https://blog.ephorie.de/why-i-dont-use-the-tidyverse hat geschrieben:One final thought: Hadley Wickham was asked the following question in 2016 (source: Quora):

> Do you expect the tidyverse to be the part of core R packages someday?

His answer is telling:

> It’s extremely unlikely because the core packages are extremely conservative so that base R code is stable, and backward compatible. I prefer to have a more utopian approach where I can be quite aggressive about making backward-incompatible changes while trying to figure out a better API.
Ich glaube, dass beide Seiten dieser Aussage zustimmen können: Im tidyverse kommt in der Abwägung "Fortschritt" versus "Backwards compability" dem Fortschritt eine große Rolle zu. Fortschritt ist dabei, was Hadley Wickham besser gefällt. Glücklicherweise hat das Grenzen. Er hat nicht ggplot2 umgeschrieben, um es mit Pipes statt Pluszeichen zu verwenden. In dieser Frage kann man verschiedene Meinungen haben und tendenziell scheint mir das tidyverse besser für Menschen, die Verständnis dafür haben, dass Sprache sich weiter entwickelt und base und data.table besser für Menschen, die erwarten, dass Code von vor 10 Jahren auch heute noch unverändert läuft (was natürlich auch mit base und data.table nicht garantiert ist. Wir erinnern uns daran, wie read.table auf einmal die Voreinstellung für stringsAsFactors geändert hat :o ).

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten