Unübersichtlichen Datensatz aufräumen

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

Moderatoren: EDi, jogo

Antworten
Queerio
Beiträge: 5
Registriert: So Jan 28, 2024 5:06 pm

Unübersichtlichen Datensatz aufräumen

Beitrag von Queerio »

Hallo ihr Lieben,

ich habe einen extrem unübersichtlichen Datensatz bekommen, mit dem ich arbeiten muss :roll:

Es geht um einen Fitnesstracker, der jeden Eintrag in der CSV als eigene Zeile ablegt.
Es werden z.B. dreimal am Tag Symptome erfasst, aber auch eingenommene Medikamente, etc. Ein Beispiel, wie das Ganze aussieht, findet ihr im Screenshot.

Pro Tag habe ich teilweise bis zu 40 Einträge. So kann da natürlich kein Mensch ordentlich mit rechnen.
Mein Ziel ist es, pro Tag eine Zeile zu haben, wo dann z.B. Sleep Quality, Symptom1_am, Symptom 1_mid, Symptom 1_pm, Medikament1 usw. die Spalten sind.

Ich nutze sonst sehr gerne tidyr für solche Sachen, damit komm ich auch ganz gut zurecht. Allerdings merke ich, dass ich bei diesem Monster an Datensatz damit an meine Grenzen komme - zumindest mit meinen Skills.

Ich würde mich wirklich sehr über Unterstützung freuen, wie ich das gut aufräumen kann.

Lg, Queerio
Dateianhänge
Screenshot 2024-01-28 172335.png
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Unübersichtlichen Datensatz aufräumen

Beitrag von bigben »

Hallo Queerio,

von dem kurzen Screenshot ist es schwer zu sagen, was für Gemeinheiten sich in so einem File noch verstecken.
Soweit man das sehen kann, würde ich zunächst einmal finden, dass man die Spalte B aufräumt. Da gibt es offensichtlich "am", "mid" und "pm". Dann gibt es Zeilen ohne Tageszeitzuordnung, die sollten nicht ohne Markierung bleiben, sondern einen eigenen Eintrag bekommen und dann kommt das problematische, die Einträgt mit Uhrzeiten. Die musst Du irgendwie kategorisieren. Ich vermute mal, dass man die Uhrzeiten auch in "am", "mid" und "pm" kategorisieren sollte?
"Medikament1 (mg)" soll man ja wahrscheinlich einer Morgen- Mittag- und Abendmedikation zuordnen können.

Ich bin ziemlich sicher, dass es im tidyverse und wahrscheinlich in tidyr eine eigenen Funktion gibt, mit der man die Spalten "time.of.day" und "detail" fusionieren kann. Ansonsten kann man natürlich auch einfach Basis-Funktionen nutzen:

Code: Alles auswählen

tracker <- data.frame(sonstiges = rnorm(6),
                      time.of.day = c("am", "am", "mid", "pm", "pm", "pm"),
                      detail = c("Symptom 1", "Symptom 2", "Medikament 1", 
                                 "Symptom 1", "Symptom 2", "Symptom 3"))
head(tracker)
#>    sonstiges time.of.day       detail
#> 1  1.0981427          am    Symptom 1
#> 2  0.6415095          am    Symptom 2
#> 3 -2.0084800         mid Medikament 1
#> 4 -2.6433191          pm    Symptom 1
#> 5 -0.8091566          pm    Symptom 2
#> 6 -0.2820777          pm    Symptom 3
tracker$neu <- paste0(tracker$detail, "_", tracker$time.of.day)
head(tracker)
#>    sonstiges time.of.day       detail              neu
#> 1  1.0981427          am    Symptom 1     Symptom 1_am
#> 2  0.6415095          am    Symptom 2     Symptom 2_am
#> 3 -2.0084800         mid Medikament 1 Medikament 1_mid
#> 4 -2.6433191          pm    Symptom 1     Symptom 1_pm
#> 5 -0.8091566          pm    Symptom 2     Symptom 2_pm
#> 6 -0.2820777          pm    Symptom 3     Symptom 3_pm

Damit kannst Du dann entweder pivot_wider oder aus Basis-R die Funktion reshape benutzen:

Code: Alles auswählen

tracker <- data.frame(date = rep(as.Date("2024-01-29"), 6),
                      messwert = round(rnorm(6),3),
                      neu = paste0(c("Symptom 1", "Symptom 2", "Medikament 1", 
                                 "Symptom 1", "Symptom 2", "Symptom 3"), "_",
                                 c("am", "am", "mid", "pm", "pm", "pm")))
head(tracker)
reshape(tracker, timevar = "neu", idvar = "date", direction = "wide")
head(tracker)

HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Queerio
Beiträge: 5
Registriert: So Jan 28, 2024 5:06 pm

Re: Unübersichtlichen Datensatz aufräumen

Beitrag von Queerio »

Danke für die schnelle Rückmeldung!

Das mit dem am, pm usw ist tatsächlich ein eher kleineres Problem. Die Medikamente sollten schon mit Uhrzeiten drin stehen, da da die genauen Zeitpunkte wichtig sind und es nur Bedarfsmedikationen sind.

Mein viel größeres Problem ist die Frage, wie ich aus diesen vielen Einträgen einen sauberen Eintrag machen kann.
Also z.B. eine Zeile habe, die in date das Datum stehen hat und dann zugeordnet als weitere Spalten die einzelnen Aspekte mit ihrem jeweiligen Zellenwert.
Das manuell über einen Vektor zu machen wird nix, da es insgesamt 4000 Beobachtungen pro Person sein.
Ich bräuchte also sowas wie Weise der Spalte date den Wert des Datums zu. Benenne Spalte 2 nach Symptom1_am und weise ihr für dieselbe Zeile den Wert zu . Weißt du, was ich meine?
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Unübersichtlichen Datensatz aufräumen

Beitrag von bigben »

Hi!
Queerio hat geschrieben: So Jan 28, 2024 6:38 pmDas mit dem am, pm usw ist tatsächlich ein eher kleineres Problem. Die Medikamente sollten schon mit Uhrzeiten drin stehen, da da die genauen Zeitpunkte wichtig sind und es nur Bedarfsmedikationen sind.
Du schreibst, dass Du Spalten der Art wie "Sleep Quality, Symptom1_am, Symptom 1_mid, Symptom 1_pm" haben möchtest. Ich kann mir nicht vorstellen, dass dazu Spalten wie "Medikament_1_(mg)_22:37, Medikament_1_(mg)_22:39, Medikament_1_(mg)_22:45" kommen sollen. Da musst Du Dir schon überlegen, wie das dann abgebildet werden soll.

Also z.B. eine Zeile habe, die in date das Datum stehen hat und dann zugeordnet als weitere Spalten die einzelnen Aspekte mit ihrem jeweiligen Zellenwert.


Ich bin davon ausgegangen, dass Du sowas normalerweise über tidyR mit der Funktion pivot_wider machst. Was ich Dir oben alternativ mit der Funktion reshape vorgemacht habe -- hast Du das bei Dir mal ausprobiert?
Das manuell über einen Vektor zu machen wird nix
Sorry, wie man was manuell über einen Vektor macht weiß ich leider nicht.
Ich bräuchte also sowas wie Weise der Spalte date den Wert des Datums zu. Benenne Spalte 2 nach Symptom1_am und weise ihr für dieselbe Zeile den Wert zu . Weißt du, was ich meine?
Entweder habe ich Dir das im zweiten Code-Block in meinem Post oben vorgemacht oder ich weiß noch nicht, was Du meinst.
https://www.statology.org/pivot_wider-r/
https://www.statology.org/r-dcast-data-table/
https://seananderson.ca/2013/10/19/reshape/

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Queerio
Beiträge: 5
Registriert: So Jan 28, 2024 5:06 pm

Re: Unübersichtlichen Datensatz aufräumen

Beitrag von Queerio »

Hey,

normalerweise nutze ich dafür über R die spread-Funktion, ich hab mich jetzt nochmal in pivot_wider reingefuxxt. Deinen zweiten Codeblock hatte ich tatsächlich überlesen :shock: Damit hat es dann letztendlich super funktioniert, vielen Dank!

Das Kernproblem lag tatsächlich darin, dass ich mir zu wenig Gedanken darüber gemacht hatte, wie es am Ende letztendlich aussehen soll. Beim vierten mal drüber schauen ist mir dann aufgefallen, dass die Auswertung pro Tag eigentlich völlig ausreicht und der Zeitpunkt irrelevant ist. Habe es jetzt quasi über Tagessummen der eingenommenen Medikamente gelöst.

Danke für die Hilfe :)
Antworten