Ga naar hoofdinhoud

Van long naar wide data in R

Leer waarom je je data van een long- naar een wide-formaat (en andersom) zou omzetten en ontdek hoe je dit in R doet met melt() en dcast()!
· 15 min lezen

Verken met AI

Er komt een moment dat je data in het lange formaat (je noemt het "de long-form"; wat dat betekent wordt zo duidelijk) naar het brede formaat moet omzetten, en andersom. Data komt in het echt in allerlei vormen, maar de meeste R-functies zijn voor één specifiek formaat gemaakt.

Sommige functies, zoals lme4::lmer() voor gemengde lineaire modellen en ggplot2::ggplot() voor visualisatie, zijn ontworpen voor long-form. Maar er zijn ook functies voor wide-form, zoals mosaicplot(). Dat betekent dat je het formaat moet omzetten om analyses of visualisaties te maken, tenzij de data al is voorbewerkt en in de juiste vorm staat.

Er zijn verschillende opties in R voor formaatconversie, maar dat kan behoorlijk verwarrend zijn als je net begint.

In deze tutorial leer je de mechaniek achter het omzetten van data tussen long-form en wide-form. Je verkent de volgende onderwerpen:

  • Je leert meer over de long-form.
  • Daarna maak je kennis met de wide-form.
  • Je herhaalt de verschillen tussen de long- en wide-formaten;
  • Vervolgens zie je welke stappen je nodig hebt om van de ene vorm naar de andere te gaan.
  • Tot slot ga je dit allemaal in R uitvoeren. Je leert hoe je van long naar wide gaat met de functies melt() en dcast().

De data

Tabel 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

Deze tabel toont de lengte van baby’s in een kleine regio. De lengtes zijn gemeten van 2011 tot en met 2015. Zoals je waarschijnlijk weet betekent NA ‘Niet beschikbaar’. Aan de positie van de NA’s kun je de leeftijden van de baby’s afleiden, maar de exacte leeftijd staat niet in de tabel. De tabel oogt netjes, maar voor wie de groei van baby’s wil bestuderen is er een probleem: het gaat niet om het absolute moment van meten, maar om de leeftijd van de baby op het moment van meten. Kun je deze informatie in de tabel opnemen? Hieronder zie je één manier:

Tabel 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

Het aantal NA’s is toegenomen. ## Wide-form data Maar wat als je wilde aangeven hoeveel maanden een baby oud was? Dat zou er zo uitzien:

Tabel 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

Er staan enorm veel NA’s in de tabel hierboven. Als de baby’s verschillen in hun relatieve meetmomenten, kan de wide-form veel ruimte verspillen. Een andere optie is om de leeftijden op te nemen die de baby’s hadden in 2015, maar dat kan alleen als de absolute meetmomenten allemaal gelijk zijn. Als de meetmomenten per baby enkele maanden verschillen en je de leeftijden in maanden wilt weten, werkt dat niet. Dan lijkt dit voorbeeld de enige manier. In zo’n geval kun je de long-form overwegen. ## Data in long-form Terwijl in wide-form alle metingen van één baby in één rij stonden, zie je in long-form per rij slechts één meting van een baby. De simpelste manier is dan om in één rij de naam van het kind, het meetmoment en de meting (lengte) te tonen. Dat is precies wat deze tabel laat zien:

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

Als je de data sorteert op naam, krijg je iets zoals de tabel hieronder. Deze tabel neemt duidelijk minder ruimte in dan Tabel 3 hierboven!

Tabel 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

Let op nogmaals wat de fundamentele verschillen zijn tussen wide-form en long-form: één eenvoudig verschil is dat wide-form veel metingen van één individu in één rij toont en de kolomnamen aangeven wat de metingen zijn.

Deze tabel toont Liam Browns lengtes in de jaren 2011-2015 in één rij:

Tabel 06
namegenderyear2011year2012year2013year2014year2015
Liam BrownM88.2496.91101.85108.13112.45

In long-form staan Liam Browns lengtes in één kolom:

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

Zoals je ziet weet je niet wat de metingen zijn. Als je de kolomnaam uitschrijft, ziet het er zo uit:

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

Maar dit heeft zijn eigen probleem. Sophia Johnsons lengte is niet gemeten in de jaren 2011-2014. Dus zoals je hieronder ziet, is de kolomnaam lastig te bepalen:

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

Van wide-form naar long-form

Het omzetten van wide-form naar long-form kun je zien als een stapsgewijs proces. Voordat je de metingen uit één rij in één kolom zet, kun je de tabel zo maken dat er per rij nog maar één meting staat. Laten we dat doen voor deze tabel:

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

Het resultaat ziet er zo uit:

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

Voordat je die metingen die over kolommen verspreid zijn in één kolom verzamelt, heb je een extra kolom nodig die aangeeft wat de metingen zijn, zoals hieronder:

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

De kolomnaam is meestal “measure” of “key”. Je ziet in de tabel hierboven dat “age0”, “age1”, “age2”, “age3”, “age4”, “age5” zowel in de kolomnamen als in één kolom voorkomen. Als je de kolomnamen weglaat, wordt de tabel als hieronder.

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

Omdat er per rij nog maar één meting is, kun je ze in één kolom samenvoegen en wordt het resultaat als volgt:

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

Laten we een nieuwe kolomnaam maken voor alle metingen. Meestal heet die "value":

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

Kijk nog eens naar de tabel hierboven. Merk je dat "age" steeds terugkomt? Je kunt het terugkerende deel weglaten, wat dit oplevert:

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

Age, dat in elke rij terugkomt, is nu een kolomnaam. De kolomnaam value in de tabel hierboven kan specifieker. Je vervangt die door height, wat duidelijker is. Het resultaat zie je hieronder:

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

Vergelijk Tabel 15 met Tabel 17. value, een van de kolomnamen in Tabel 15, kan van alles betekenen, maar height in Tabel 17 is heel specifiek: dat kan alleen lengte aanduiden, terwijl value in Tabel 15 elke waarde kan zijn, zoals lengte, gewicht, snelheid of kleur. Een andere manier is als volgt:

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

Stel nu dat de metingen divers zijn. Als de metingen lengte, gewicht en BMI zijn, ziet het er uit als de onderstaande tabel. Maar in dit geval bevat de kolom value numerieke waarden op verschillende schalen, wat verwarrend kan zijn om te lezen. In deze tabel is lengte gemeten in centimeter en gewicht in kilogram:

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

Dus bij het omzetten van wide-form naar long-form moet je beslissen welke waarden je in één kolom verzamelt. Daarna kun je de kolomnaam bepalen.

Laten we samenvatten wat tot nu toe is gezegd: om wide-form naar long-form om te zetten, moet je bepalen welke kolommen worden aangepast zodat ze in één kolom staan. Daarbij worden veel kolommen samengevoegd tot één kolom. Daar heb je dus een kolomnaam voor nodig, zoals je in de volgende tabellen ziet:

Tabel 20
id1id2age0age1age2
Emma WilliamsFNA82.4691.76
Aiden JonesM69.7679.89NA
Emma WilliamsFNA82.4691.76
Tabel 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
Tabel 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
Tabel 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
Tabel 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
Tabel 25
id1id2keyvalue
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Emma WilliamsFage182.46
Emma WilliamsFage291.76

Laten we naar de kolommen id1 en id2 in de bovenstaande tabel kijken. id2 specificeert geen individu, maar is het attribuut (geslacht) van een individu. Met andere woorden, je kunt zeggen dat het een meting is. Dus je kunt het omzetten naar de langer-vorm. De langst mogelijke vorm bestaat uit drie kolommen: id, key en value.

Tabel 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

De bovenstaande tabel laat de langst mogelijke vorm zien van tabel 25. Maar verschillende mensen kunnen dezelfde naam hebben.

In dat geval kan de long-form verwarrend zijn, omdat id niet één persoon kan aanduiden. Je kunt een nummer achter de naam zetten om personen te onderscheiden (bijvoorbeeld met de R-functie make.unique()), maar je kunt een bestaande naam met een nummer niet onderscheiden van een originele naam die toevallig al een nummer bevat. Denk maar aan iemand die echt "John.2" heet!

De voor de hand liggende oplossing is om verschillende numerieke ID’s toe te kennen aan verschillende personen. In dat geval zijn namen weer metingen.

De volgende tabel laat zien dat zelfs namen als metingen worden beschouwd. In zekere zin is dit de echte langst mogelijke vorm.

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

De langst mogelijke vorm is de makkelijkste vorm om een wide-form van te maken. Als je het proces van wide-form naar long-form omdraait, zoals te zien is in tabellen 20 tot en met 25, kom je weer uit op de wide-form. De volgende tabellen laten dit proces zien:

Tabel 28. Metingen in de kolom key worden herhaald in de kolomnaam
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
Tabel 29. Kolom key kan worden verwijderd
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
Tabel 30. Dezelfde id kan op één rij worden samengevoegd
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
1     
1     
1     
2Aiden JonesF69.7679.89 
2     
2     
2     
3Emma WilliamsF 82.4691.76
3     
3     
3     
Tabel 31. Verwijder elke rij zonder metingen
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
2Aiden JonesF69.7679.89 
3Emma WilliamsF 82.4691.76

De cruciale stap bij het omzetten van wide-form naar long-form is bepalen welke kolommen je samenvoegt tot één kolom.

Maar het hoeft niet per se één kolom te zijn. Je kunt ook twee kolommen gebruiken als dat nodig is, zoals in de onderstaande tabel:

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

Kun je dit omzetten naar de long-form?

Kolommen h2011, h2012, w2011, w2012 betekenen lengte en gewicht in de jaren 2011 en 2012. height en weight worden gemeten op verschillende schalen — cm, kg. Je kunt dus één kolom gebruiken voor zowel lengte als gewicht, of je gebruikt twee kolommen, zoals in deze tabel:

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

Is dit de long-form of de wide-form?

Van long naar wide data in R

Laten we de conversie tussen long-form en wide-form in R doen. Er zijn veel functies en packages beschikbaar voor deze taak.

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

Hier leg ik uit hoe je de functies melt() en dcast() uit het package reshape2 gebruikt. De reden is dat stack() en unstack() basisfuncties zijn, waardoor je de resultaten ervan nog moet nabewerken. Let op: gather() en spread() zijn functies uit tidyr die ook heel populair zijn, maar die komen in deze tutorial niet aan bod.

Een andere functie die je kunt gebruiken is reshape() uit het package stats. Raak niet in de war door deze functie, want er bestaat ook een package dat reshape heet! Dit package, samen met reshape2, is ontwikkeld voor wie moeite had met reshape(). Bovendien lijkt de functie reshape() ervan uit te gaan dat de data longitudinaal zijn, wat betekent dat metingen in de tijd worden herhaald.

Laten we de gegevens in tabel 35 omzetten naar de long-form. Neem aan dat de onderstaande tabel is opgeslagen in een data.frame met de naam dat.

Tabel 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

De vraag die je jezelf stelt is: "welke kolommen voeg je samen tot één kolom?"

Dat zijn year2011, year2012, year2013. Als je de functie melt() gebruikt, moeten die kolommen worden opgegeven bij measure.vars:

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 staan in de 3e, 4e en 5e kolom, dus je kunt dat gebruiken:

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

Het resultaat staat in de tabel hierboven. Let op de kolomnamen variable en value. Tabel 23 en tabel 24 lieten zien dat de nieuwe kolomnamen nodig zijn. De functie melt() heeft standaardnamen voor nieuwe kolommen: variable en value. Je kunt de standaardwaarden overschrijven met de argumenten variable.name= en value.name=. Laten we dat hieronder doen:

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 de voorbeelden hierboven zijn de metingen expliciet opgegeven. Voor de instellingen waar jij mee werkt, kan Id de metingen indirect specificeren. Je kunt dus kolommen voor id kiezen in plaats van metingen.

De resultaten zijn in beide gevallen hieronder hetzelfde. De eerste kiest kolommen voor id, de tweede kiest de kolommen die verzameld moeten worden:

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

Als je zowel id.vars als measure.vars opgeeft, worden kolommen die in geen van beide zijn opgenomen uit het resultaat weggelaten. Kijk ter illustratie naar het onderstaande codeblok:

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

Daarnaast kan na.rm=T NAs verwijderen:

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

De functie dcast() doet het omgekeerde van melt(). id, variable en value zijn de kolommen van de langste vorm. dcast(data, id ~ variable, value.var="value") zet de langste vorm om naar de brede vorm.

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 heeft name voor id, variable voor variable en value voor value. Je kunt dus dcast() gebruiken om het naar de brede vorm om te zetten:

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

Conclusie

Dat was het zo ongeveer. In deze tutorial heb je je gericht op het begrijpen van de logica en het proces van het herstructureren van data. Meestal heeft de lange vorm de voorkeur voor analyse, maar er zijn uitzonderingen. Presentatie van data in brede vorm kan ruimte besparen wanneer dat passend is, maar naarmate het aantal missende waarden toeneemt, kun je beter overstappen op de lange vorm.

Voor de formaatconversie moet je focussen op wat de metingen zijn. Het motto voor de lange vorm is: één meting per rij, en de brede vorm heeft meerdere metingen in één rij. Als je metingen maakt door kolommen te verzamelen in één kolom, moeten de oorspronkelijke kolomnamen behouden blijven in een extra kolom. Als je metingen in één kolom uitsmeert over meerdere kolommen, moet je bepalen wat de kolomnamen moeten zijn op basis van de kolom variable.

Als je het proces eenmaal begrijpt, wordt werken met functies zoals dcast() en melt() een stuk makkelijker!

Onderwerpen

Gerelateerd