wide to Long mit Tidyr

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
Carolin
Beiträge: 8
Registriert: Fr Okt 04, 2019 2:36 pm

wide to Long mit Tidyr

Beitrag von Carolin » Do Okt 10, 2019 4:39 pm

Hallo alle zusammen,

ich möchte mein recht komplexes Längsschnittdatenset (T=4) für eine LMM Analyse ins Longformat bringen und dafür tidyr nutzen.
Ich habe mehrere Variablen, die (gruppiert nach Zeit) in jeweils verschiedenen Spalten landen sollen. Es gibt 240 Spalten, deswegen skizziere ich hier nur.

Code: Alles auswählen

T1_Pendeldauer T2_Pendeldauer T3_Pendeldauer T4_Pendeldauer T1_emostab T2_emostab T3_emostab T4_emostab T1_ress T2_ress T3_ress T4_ress

usw....
im Longformat sollen es dann eben als Zeilen Pendeldauer, emostab und ress geben.

Wie kann ich mit tidyr mehrere solcher Umformungen vornehmen?

mit diesem Befehl

Code: Alles auswählen

 selected.data.LONG<- pivot_longer(selected.data, c(T2_commres, T3_commres, T4_commres, T5_commres),names_to = "Tx_commres", values_to = "commres")
klappt es zwar, aber wenn ich ihn fpr eine weitere variable nutze, wird das vorherige immer wieder überschrieben.

Die Lösung ist bestimmt leicht; ich bin leider (noch) eine Informatik-Niete. :)

Liebe Grüße
###Carolin

Benutzeravatar
databraineo
Beiträge: 10
Registriert: Mo Apr 02, 2018 8:20 am

Re: wide to Long mit Tidyr

Beitrag von databraineo » Fr Okt 11, 2019 7:31 am

Hallo Carolin,

Du bist ja schon auf dem richtigen Weg, mit pivot_longer kannst Du das machen. Allerdings muss man alle Variablen in einem Rutsch umformen und kann das nicht nacheinander machen (spart ja auch Programmierarbeit) :D

Hier erstmal ein Dummy-Datensatz, falls andere Leute es auch nachvollziehen wollen: 8-)

Code: Alles auswählen

library(tidyr)

n <- 50
df_wide <- data.frame(T1_Pendeldauer = rnorm(n), 
                      T2_Pendeldauer = rnorm(n), 
                      T3_Pendeldauer = rnorm(n),
                      T4_Pendeldauer = rnorm(n), 
                      T1_emostab = rnorm(n),
                      T2_emostab = rnorm(n),
                      T3_emostab = rnorm(n),
                      T4_emostab = rnorm(n),
                      T1_ress = rnorm(n),
                      T2_ress = rnorm(n),
                      T3_ress = rnorm(n),
                      T4_ress = rnorm(n))
Du hast zwei Möglichkeiten, wie Dein Längs-Datensatz aussehen soll, einen echten Längsdatensatz, bei dem es nur 3 Spalten gibt oder eine Mischform, bei der nur der Zeitpunkt "längs" ist, es aber für jede Variable eine Spalte gibt. Ich vermute, Du willst die 2. Form haben.

1. Möglichkeit: echter Längsdatensatz
Dann gibt es nur die Spalten Zeitpunkt, Variable und Wert. In deinem Beispiel würde Zeitpunkt die Werte T1, T2, T3 oder T4 annehmen, Variable Pendeldauer, emostab und ress und in der Spalte Wert stehen eben die entsprechenden Werte drin.

Das geht folgendermaßen:

Code: Alles auswählen

df_long <- df_wide %>% pivot_longer(cols = starts_with("T"),
                                    names_sep = "_",
                                    names_to = c("Tx","Variable"),
                                    values_to = "Wert")
2. Möglichkeit: halber Längsdatensatz: nur Zeitpunkte als Zeilen
Da ist ein bisschen komplizierter, :shock: denn Du must zwei Gruppen per regulärem Ausdruck (regex) mittels names_pattern definieren. Die Gruppen werden in den Klammern definiert.
Die erste Gruppe (T[1234]) ist ein regulärer Ausdruck für T1 oder T2 oder T3 oder T4. Es wäre auch (T[1-4]) oder (T1|T2|T3|T4) möglich.
Dann folgt der Unterstrich _
Die zweite Gruppe spiegelt die Variable wider. Da diese beliebige Werte annehmen kann, benutze ich den Punkt . (ein beliebiges Zeichen), gefolgt von einem Stern * (beliebige Wiederholung des Zeichens).

Code: Alles auswählen

df_mix <- df_wide %>% pivot_longer(cols = starts_with("T"),
                                   names_to = c("Tx",".value"),
                                   names_pattern = "(T[1234])_(.*)")
Hoffe, das hilft Dir weiter. Reguläre Ausdrücke sind zwar am Anfang ein wenig kompliziert, aber super nützlich. Ich hatte letztes Jahr mal eine Anleitung für regulären Ausdrücken in R geschrieben, wenn Du mehr darüber wissen willst (https://databraineo.de/regulaere-ausdruecke-in-r-erklaert)

Viele Grüße,
Holger
Lasst uns helfen, dass Menschen mittels Datenanalyse intelligente Entscheidungen treffen

Website: Databraineo - Data Science Blog
Twitter: @databraineo
Facebook-Gruppe: Data Science Deutschland

Carolin
Beiträge: 8
Registriert: Fr Okt 04, 2019 2:36 pm

Re: wide to Long mit Tidyr

Beitrag von Carolin » Di Okt 15, 2019 10:53 am

Lieber Holger,

bin gerade erst dazu gekommen es ausprobieren - es hat geklappt!!! Vielen lieben Dank; das hat mich einen großen Schritt weiter gebracht!

Antworten