Hallo ihr Lieben,
ich habe einen extrem unübersichtlichen Datensatz bekommen, mit dem ich arbeiten muss
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
Unübersichtlichen Datensatz aufräumen
Re: Unübersichtlichen Datensatz aufräumen
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:
Damit kannst Du dann entweder pivot_wider oder aus Basis-R die Funktion reshape benutzen:
HTH,
Bernhard
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
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
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Unübersichtlichen Datensatz aufräumen
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?
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?
Re: Unübersichtlichen Datensatz aufräumen
Hi!
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?
https://www.statology.org/pivot_wider-r/
https://www.statology.org/r-dcast-data-table/
https://seananderson.ca/2013/10/19/reshape/
LG,
Bernhard
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?
Sorry, wie man was manuell über einen Vektor macht weiß ich leider nicht.Das manuell über einen Vektor zu machen wird nix
Entweder habe ich Dir das im zweiten Code-Block in meinem Post oben vorgemacht oder ich weiß noch nicht, was Du meinst.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?
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
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Unübersichtlichen Datensatz aufräumen
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 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
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 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