Zum Hauptinhalt springen

Long- zu Wide-Daten in R

Verstehe, warum du Daten zwischen Long- und Wide-Format transformierst, und lerne, wie das in R mit melt() und dcast() funktioniert!
· 15 Min. lesen

Entdecke KI

Es gibt Situationen, in denen Daten vom Long-Format (was damit gemeint ist, wird gleich klar) ins Wide-Format umgewandelt werden müssen – und umgekehrt. Reale Daten liegen in den unterschiedlichsten Formaten vor, aber viele R-Funktionen sind auf eine bestimmte Form ausgelegt.

So sind etwa lme4::lmer() für gemischte lineare Modelle oder ggplot2::ggplot() für Visualisierung auf Long-Form ausgelegt. Andere Funktionen wie mosaicplot() erwarten hingegen Wide-Form. Das bedeutet: Wenn deine Daten nicht bereits passend aufbereitet sind, musst du für Analyse oder Visualisierung das Format wechseln.

In R gibt es mehrere Wege für Formatumwandlungen – gerade am Anfang kann das verwirrend sein.

In diesem Tutorial lernst du die Mechanik hinter der Umwandlung zwischen Long- und Wide-Form kennen. Dich erwarten folgende Themen:

  • Du lernst, was die Long-Form ausmacht.
  • Dann erfährst du, was die Wide-Form ist.
  • Du wiederholst die Unterschiede zwischen Long- und Wide-Format.
  • Im Anschluss siehst du, welche Schritte nötig sind, um von einer Form in die andere zu wechseln.
  • Zum Schluss setzt du alles in R um: Du lernst, wie du mit den Funktionen melt() und dcast() vom Long- ins Wide-Format und zurück wechselst.

Die Daten

Tabelle 01
namegenderyear2011year2012year2013year2014year2015
Jackson SmithM74.6984.9991.73105.11111.04
Sophia JohnsonFNANANANA75.89
Emma WilliamsFNANA75.7486.5091.50
Aiden JonesMNANANA71.8981.42
Liam BrownM88.2496.91101.85108.13112.45
Lucas DavisM70.6083.7894.17100.03106.35
Olivia MillerF64.7880.7687.3097.13103.80
Ava WilsonF88.7796.45104.72112.84NA

Die Tabelle zeigt die Größe von Babys in einem kleinen Einzugsgebiet. Gemessen wurde von 2011 bis 2015. Wie du sicher weißt, bedeutet NA „Not Available“ (nicht verfügbar). Anhand der Positionen der NAs lässt sich das Alter der Babys ableiten, aber das exakte Alter ist der Tabelle nicht zu entnehmen. Die Tabelle wirkt ordentlich, doch wer das Wachstum der Babys untersuchen will, hat ein Problem: Entscheidend ist nicht der absolute Messzeitpunkt, sondern das Alter des Babys bei der Messung. Kannst du diese Information ergänzen? So könnte es aussehen:

Tabelle 02
namegenderage0age1age2age3age4age5age6
Jackson SmithMNA76.6984.9197.06105.73107.32NA
Sophia JohnsonFNA76.05NANANANANA
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA
Liam BrownMNANA85.3493.22105.78105.84114.82
Lucas DavisM71.5984.8792.10100.73104.21NANA
Olivia MillerF62.7481.3992.0298.32106.44NANA
Ava WilsonFNANA88.39100.67107.58111.52NA

Die Zahl der NAs ist gestiegen. ## Wide-Form-Daten Was, wenn du das Alter in Monaten abbilden willst? Dann sähe es etwa so aus:

Tabelle 03
namegenderm4m6m7m10m12...m55m60m65m72
Jackson SmithMNANANANA76.69...NA107.32NANA
Sophia JohnsonFNANANANA76.05...NANANANA
Emma WilliamsFNANANA72.65NA...NANANANA
Aiden JonesMNA69.76NANANA...NANANANA
Liam BrownMNANANANANA...NA105.84NA114.82
Lucas DavisMNANA71.59NANA...104.21NANANA
Olivia MillerF62.74NANANANA...NANANANA
Ava WilsonFNANANANANA...NANA111.52NA

In der Tabelle oben häufen sich die NAs. Wenn sich die relativen Messzeitpunkte der Babys unterscheiden, verschwendet die Wide-Form viel Platz. Eine Alternative wäre, das Alter der Babys für das Jahr 2015 aufzunehmen – das geht aber nur, wenn alle absoluten Messzeitpunkte identisch sind. Variieren die Zeiten um Monate und du willst das Alter in Monaten wissen, funktioniert das nicht. In so einem Fall bietet sich Long-Form an. ## Daten in Long-Form Während in der Wide-Form alle Messungen eines Babys in einer Zeile stehen, enthält die Long-Form pro Zeile genau eine Messung eines Babys. Am einfachsten: Name des Kindes, Messzeitpunkt und Messwert (Größe) in einer Zeile. Genau das zeigt diese Tabelle:

Tabelle 04
namegendermonthheight
Olivia MillerF462.74
Aiden JonesM669.76
Lucas DavisM771.59
Emma WilliamsF1072.65
Jackson SmithM1276.69
............
Liam BrownM72114.82

Sortierst du die Daten nach Namen, erhältst du eine Tabelle wie unten. Sie braucht deutlich weniger Platz als Tabelle 3 oben.

Tabelle 05
namegendermonthheight
Jackson SmithM1276.69
Jackson SmithM2484.91
Jackson SmithM3697.06
Jackson SmithM48105.73
Jackson SmithM60107.32
Sophia JohnsonF1276.05
Emma WilliamsF1072.65
............
Ava WilsonF65111.52

Long versus Wide

Merke dir noch einmal den grundlegenden Unterschied zwischen Wide- und Long-Form: In der Wide-Form stehen viele Messungen einer Person in einer Zeile und die Spaltennamen geben an, was gemessen wurde.

Diese Tabelle zeigt Liam Browns Größen in den Jahren 2011–2015 in einer Zeile:

Tabelle 06
namegenderyear2011year2012year2013year2014year2015
Liam BrownM88.2496.91101.85108.13112.45

In der Long-Form stehen Liam Browns Größen in einer Spalte:

Tabelle 07
namegender_
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82

Wie du siehst, ist nicht erkennbar, worauf sich die Messungen beziehen. Ergänzt du den Spaltennamen, sieht es so aus:

Tabelle 08
namegenderyear2011, 2012, 2013, 2014, 2015
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82

Auch das hat einen Haken: Sophia Johnsons Größe wurde 2011–2014 nicht gemessen. Wie unten zu sehen, lässt sich der Spaltenname dann nicht einheitlich setzen:

Tabelle 09
namegender?
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82
Sophia JohnsonF76.05

Von Wide- zu Long-Form

Die Umwandlung von Wide nach Long lässt sich in Schritte zerlegen. Bevor du mehrere Messungen aus einer Zeile in eine Spalte kippst, kannst du die Tabelle so umstellen, dass jede Zeile genau eine Messung enthält. Machen wir das für diese Tabelle:

Tabelle 10
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA

Das Ergebnis sieht dann so aus:

Tabelle 11
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.65  NANANANA
Emma WilliamsF 82.46    NA
Emma WilliamsF  91.76    
Aiden JonesM69.76 NANANANANA
Aiden JonesM 79.89     

Bevor du die über mehrere Spalten verteilten Messwerte in einer Spalte zusammenführst, brauchst du eine zusätzliche Spalte, die angibt, um welche Messung es sich handelt – so wie hier:

Tabelle 12
namegendermeasureage0age1age2age3age4age5age6
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46    NA
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 79.89     

Die neue Spalte heißt oft "measure" oder "key". Du siehst oben, dass "age0", "age1", "age2", "age3", "age4", "age5" sowohl in den Spaltennamen als auch in einer Spalte vorkommen. Lässt du die Spaltennamen weg, ergibt sich Folgendes:

Tabelle 13
namegendermeasure____________________________
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46     
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 79.89     

Da nun pro Zeile nur noch eine Messung steht, kannst du sie in einer Spalte sammeln – das Ergebnis:

Tabelle 14
namegendermeasure 
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

Gib der Messwertspalte einen sinnvollen Namen. Üblich ist „value“:

Tabelle 15
namegendermeasurevalue
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

Fällt dir auf, dass „age“ sich ständig wiederholt? Den wiederkehrenden Teil kannst du herauslösen – das Ergebnis:

Tabelle 16
namegenderagevalue
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.89

Age, das sich in jeder Zeile wiederholt, ist jetzt ein Spaltenname. Den generischen Spaltennamen value kannst du präzisieren, etwa zu height. Das macht die Bedeutung eindeutig. So sieht das aus:

Tabelle 17
namegenderageheight
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.89

Vergleiche Tabelle 15 mit Tabelle 17: value könnte alles Mögliche sein, height ist eindeutig. Alternativ geht auch Folgendes:

Tabelle 18
namegendermeasurevalue
Emma WilliamsFheight.age072.65
Emma WilliamsFheight.age182.46
Emma WilliamsFheight.age291.76
Aiden JonesMheight.age069.76
Aiden JonesMheight.age179.89

Betrachten wir den Fall, dass verschiedene Messgrößen vorliegen. Wenn Höhe, Gewicht und BMI gemessen werden, könnte es so aussehen. Allerdings enthält die Spalte value dann Werte auf unterschiedlichen Skalen, was verwirrend sein kann. In dieser Tabelle wurde die Größe in Zentimetern, das Gewicht in Kilogramm gemessen:

Tabelle 19
namegendermeasurevalue
Emma WilliamsFheight72.65
Emma WilliamsFweight8.22
Emma WilliamsFBMI22.60
Aiden JonesMheight69.76
Aiden JonesMweight8.51

Bei der Umwandlung von Wide zu Long musst du also entscheiden, welche Werte in einer Spalte gesammelt werden. Danach vergibst du einen passenden Spaltennamen.

Fassen wir zusammen: Um Wide in Long umzuwandeln, musst du festlegen, welche Spalten zu einer Spalte zusammengeführt werden. Dadurch werden viele Spalten in einer gebündelt – diese braucht einen Namen. So sieht das in den nächsten Tabellen aus:

Tabelle 20
id1id2age0age1age2
Emma WilliamsFNA82.4691.76
Aiden JonesM69.7679.89NA
Emma WilliamsFNA82.4691.76
Tabelle 21
id1id2age0age1age2
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Aiden JonesM69.76  
Aiden JonesM 79.89 
Aiden JonesM  NA
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Tabelle 22
id1id2age_age0age1age2
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Aiden JonesMage069.76  
Aiden JonesMage1 79.89 
Aiden JonesMage2  NA
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Tabelle 23
id1id2age_ 
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Tabelle 24
id1id2keyvalue
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Tabelle 25
id1id2keyvalue
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Emma WilliamsFage182.46
Emma WilliamsFage291.76

Schau dir die Spalten id1 und id2 an. id2 identifiziert keine Person, sondern ist ein Attribut (Geschlecht). Das ist letztlich auch eine Messung. Du kannst es also noch „länger“ machen. Die längstmögliche Form besteht aus drei Spalten: id, key und value.

Tabelle 26
idkeyvalue
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76
Aiden JonesgenderF
Aiden Jonesage069.76
Aiden Jonesage179.89
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76

Obige Tabelle zeigt die längste Form zu Tabelle 25. Aber: Verschiedene Personen können denselben Namen haben.

Dann wird die Long-Form unklar, weil id keine Person eindeutig identifiziert. Du könntest Nummern anhängen (z. B. mit make.unique() in R), aber so unterscheidest du nicht zuverlässig zwischen geändertem und ursprünglichem Namen. Stell dir vor, jemand heißt tatsächlich „John.2“!

Die naheliegende Lösung: Eine numerische ID pro Person. Dann sind Namen wiederum Messungen.

Die nächste Tabelle zeigt, dass sogar Namen als Messung betrachtet werden. In gewisser Weise ist das die „wahre“ längste Form.

Tabelle 27
idkeyvalue
1nameEmma Williams
1genderF
1age182.46
1age291.76
2nameAiden Jones
2genderF
2age069.76
2age179.89
3nameEmma Williams
3genderF
3age182.46
3age291.76

Die längste Form eignet sich am besten, um wieder zur Wide-Form zu wechseln. Kehre die Schritte aus den Tabellen 20 bis 25 um – so kommst du zurück zur Wide-Form. Die nächsten Tabellen zeigen den Prozess:

Tabelle 28. Messungen in der Spalte key werden in Spaltennamen zurückgeführt
idkeynamegenderage0age1age2
1nameEmma Williams    
1gender F   
1age1   82.46 
1age2    91.76
2nameAiden Jones    
2gender F   
2age0  69.76  
2age1   79.89 
3nameEmma Williams    
3gender F   
3age1   82.46 
3age2    91.76
Tabelle 29. Spalte key kann entfernt werden
idnamegenderage0age1age2
1Emma Williams    
1 F   
1   82.46 
1    91.76
2Aiden Jones    
2 F   
2  69.76  
2   79.89 
3Emma Williams    
3 F   
3   82.46 
3    91.76
Tabelle 30. Gleiche id zu einer Zeile zusammenführen
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
1     
1     
1     
2Aiden JonesF69.7679.89 
2     
2     
2     
3Emma WilliamsF 82.4691.76
3     
3     
3     
Tabelle 31. Zeilen ohne Messwerte löschen
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
2Aiden JonesF69.7679.89 
3Emma WilliamsF 82.4691.76

Der Schlüssel bei der Umwandlung von Wide zu Long ist die Entscheidung, welche Spalten in einer Spalte zusammengeführt werden.

Es muss dabei nicht bei einer Spalte bleiben. Du kannst auch zwei Zielspalten nutzen, wenn es sinnvoll ist – wie in dieser Tabelle:

Tabelle 32
namegenderh2011h2012w2011w2012
Jackson SmithM74.6984.999.6012.0
Olivia MillerFNA80.767.1510.7
Ava WilsonF88.7796.45NA15.0

Kannst du das in die Long-Form bringen?

Die Spalten h2011, h2012, w2011, w2012 stehen für Größe und Gewicht in den Jahren 2011 und 2012. height und weight sind unterschiedlich skaliert (cm, kg). Du kannst sie in eine gemeinsame oder in zwei getrennte Spalten schreiben – so wie hier:

Tabelle 33
namegenderyearheightweight
Jackson SmithM201174.699.60
Jackson SmithM201284.9912.00
Olivia MillerF2011NA80.76
Olivia MillerF20127.1510.70
Ava WilsonF201188.7796.45
Ava WilsonF2012NA15.00

Ist das nun Long- oder Wide-Form?

Von Long zu Wide in R

Lass uns die Umwandlung zwischen Long- und Wide-Form in R durchführen. Es gibt zahlreiche Funktionen und Pakete dafür.

Tabelle 34
funcpackageto_long_formto_wide_form
stack/unstackutilsstackunstack
reshapestatsreshape(direction="long", ...)reshape(direction="wide", ...)
melt/dcastreshape2meltdcast
gather/spreadtidyrgatherspread

Hier zeige ich dir melt() und dcast() aus dem Paket reshape2. stack() und unstack() sind zwar Basisfunktionen, erfordern aber oft Nachbearbeitung. gather() und spread() aus tidyr sind ebenfalls beliebt, werden hier aber nicht behandelt.

Eine weitere Option ist reshape() aus dem Paket stats. Verwechsle die Funktion nicht mit dem Paket reshape! Dieses sowie reshape2 wurden entwickelt, um die Arbeit mit reshape() zu erleichtern. Außerdem setzt reshape() oft Längsschnittdaten voraus, also wiederholte Messungen über die Zeit.

Konvertieren wir die Daten aus Tabelle 35 in die Long-Form. Angenommen, die Tabelle ist als data.frame dat gespeichert.

Tabelle 35
namegenderyear2011year2012year2013
Jackson SmithM74.6984.9991.73
Emma WilliamsFNANA75.74
Liam BrownM88.24NA101.85
Ava WilsonF88.7796.45NA

babies = data.frame(name= c("Jackson Smith", "Emma Williams", "Liam Brown", "Ava Wilson"), gender = c("M", "F", "M", "F"), year2011= c(74.69, NA, 88.24, 88.77), year2012=c(84.99, NA, NA, 96.45), year2013=c(91.73, 75.74, 101.83, NA)) babies

##            name gender year2011 year2012 year2013
## 1 Jackson Smith      M    74.69    84.99    91.73
## 2 Emma Williams      F       NA       NA    75.74
## 3    Liam Brown      M    88.24       NA   101.83
## 4    Ava Wilson      F    88.77    96.45       NA

Die zentrale Frage lautet: „Welche Spalten sollen zu einer Spalte zusammengeführt werden?“

Das sind hier year2011, year2012, year2013. Mit melt() gibst du diese Spalten in measure.vars an:

melt(babies, measure.vars = c("year2011", "year2012", "year2013"))

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

year2011, year2012, year2013 sind die Spalten 3, 4 und 5 – das kannst du auch so angeben:

melt(babies, measure.vars = 3:5)

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

Das Ergebnis siehst du oben. Beachte die Spaltennamen variable und value. In Tabelle 23 und 24 hast du gesehen, dass neue Spaltennamen nötig sind. melt() verwendet standardmäßig variable und value. Mit variable.name= und value.name= kannst du das überschreiben:

melt(babies, measure.vars=3:5, variable.name="year", value.name="height")

##             name gender     year height
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

In den Beispielen oben wurden die Messungen explizit angegeben. In manchen Fällen lassen sich Messungen auch indirekt über die IDs festlegen. Dann wählst du die ID-Spalten statt der Messspalten.

Beide Varianten führen zum gleichen Ergebnis. Die erste wählt ID-Spalten, die zweite die zu sammelnden Spalten:

melt(babies, id.vars=c("name","gender"))

melt(babies, measure.vars = c("year2011", "year2012", "year2013"))

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

Gibst du sowohl id.vars als auch measure.vars an, werden Spalten, die in keiner der beiden Listen stehen, ausgeschlossen. Beispiel:

melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"))

##            name variable value
## 1 Jackson Smith year2011 74.69
## 2 Emma Williams year2011    NA
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 6 Emma Williams year2012    NA
## 7    Liam Brown year2012    NA
## 8    Ava Wilson year2012 96.45

Mit na.rm=T kannst du NAs entfernen:

melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)

##            name variable value
## 1 Jackson Smith year2011 74.69
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8    Ava Wilson year2012 96.45

dcast() macht das Gegenteil von melt(). Die Spalten id, variable und value bilden die längste Form. dcast(data, id ~ variable, value.var="value") bringt sie zurück in die Wide-Form.

babiesLong <- melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)
babiesLong

##            name variable value
## 1 Jackson Smith year2011 74.69
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8    Ava Wilson year2012 96.45

babiesLong enthält name als id, variable als variable und value als value. Mit dcast() stellst du wieder auf Wide um:

dcast(babiesLong, name ~ variable, value.var="value")

##            name year2011 year2012
## 1    Ava Wilson    88.77    96.45
## 2 Jackson Smith    74.69    84.99
## 3    Liam Brown    88.24       NA

Fazit

Das war’s im Wesentlichen. In diesem Tutorial ging es darum, die Logik und den Prozess des Umformens von Daten zu verstehen. Für Analysen ist Long-Form meist im Vorteil, es gibt aber Ausnahmen. Zur Präsentation kann Wide-Form Platz sparen – je mehr fehlende Werte auftreten, desto eher lohnt sich die Umstellung auf Long-Form.

Für die Formatumwandlung musst du klären, was die Messungen sind. Das Motto der Long-Form lautet: eine Messung pro Zeile; in der Wide-Form stehen viele Messungen in einer Zeile. Wenn du Messungen aus mehreren Spalten in einer Spalte sammelst, müssen die ursprünglichen Spaltennamen in einer Zusatzspalte erhalten bleiben. Wenn du Messungen aus einer Spalte wieder auf Spalten verteilst, leitest du die Spaltennamen aus der Spalte variable ab.

Wenn du den Prozess verinnerlicht hast, gehen Funktionen wie dcast() und melt() leicht von der Hand!

Themen

Ähnlich

Tutorial

OLS-Regression: Die wichtigsten Ideen erklärt

Tutorial

Python Datenstrukturen Tutorial