Basisvaardigheden in R: Gegevens binnen en buiten R krijgen
Breed vs lang formaat
Inleiding en de dataset voor het voorbeeld Wanneer je alle data hebt ingevoerd, opgeschoond en gecontroleerd, dan kan het nog zijn dat de dataset niet de juiste structuur heeft. Met structuur bedoelen we hier hoe de onafhankelijk en afhankelijke variabelen en de subject id's, enzovoort, zijn ingedeeld. Er wordt een onderscheid gemaakt tussen een tabel in breed en lang formaat. We leggen het verschil uit aan de hand van het volgende voorbeeld. Kennis en ervaring met deze twee formaten is van belang omdat statistische functies en visualisatie functies in R meestal een long formaat eisen, terwijl de gegevens misschien wel in breed formaat beschikbaar zijn. Een conversie van de structuur is dan nodig.
Stel dat je onderzoek doet naar het geheugen van oudere personen en het effect van een geheugentraining hierop wilt beproeven. De proefpersonen doen aan het begin van het onderzoek een geheugentest; dit heet gewoonlijk de voortoets. Vervolgens volgen de proefpersonen een geheugentraining van 4 weken. Aan het einde van de trainingsperiode doen zij opnieuw een geheugentest; dit heet gewoonlijk de natoets. De verschilscore zegt iets over het korte-termijn effect van de geheugentraining.
We gebruiken onderstaande fictieve tabel waarin de scores van 4 proefpersonen op de 2 geheugentoetsen staan.
proefpersoon | voortoets | natoets |
A | 525 | 780 |
B | 610 | 790 |
C | 630 | 840 |
D | 575 | 800 |
Tabel in breed formaat De meest intuïtieve manier om de meetgegevens uit ons voorbeeld in een tabel op te slaan is om voor elke proefpersoon (de onafhankelijke variabele) alle gegevens (de afhankelijke variabelen) in opeenvolgende kolommen vast te leggen meetgegevens. De aanduiding of ID voor de proefpersoon staat dan in de eerste kolom en bevat geen dubbele waarden. Dit is de manier waarop we hierboven de gegevens getabelleerd hebben. Dit heet een tabel in breed formaat.
In R kunnen we de gegevens op deze manier snel invoeren in een dataframe:
> proefpersoon <- c("A", "B", "C", "D")
> voortoets <- c(525, 610, 630, 575)
> natoets <- c(780, 790, 840, 800)
> df_breed <- data.frame(proefpersoon, voortoets, natoets)
> df_breed
proefpersoon voortoets natoets
1 A 525 780
2 B 610 790
3 C 630 840
4 D 575 800
Tabel in lang formaat Er is nog een andere manier om de gegevens tabelleren, namelijk in lang formaat. In ons voorbeeld staan dan alle scores van de verschillende toetsen in dezelfde kolom, met daarnaast een kolom die aanduid bij welke toets, voor- of natoets, iedere meetwaarde hoort, en een kolom die aanduid van welke proefpersoon de meetwaarde afkomstig is zoals geïllustreerd in onderstaande tabel.
proefpersoon | soort toets | score |
A | voortoets | 525 |
B | voortoets | 610 |
C | voortoets | 630 |
D | voortoets | 575 |
A | natoets | 780 |
B | natoets | 790 |
C | natoets | 840 |
D | natoets | 800 |
In R kunnen we de gegevens op deze manier wel invoeren in een dataframe, maar het kost meer moeite, zeker als het aantal proefpersonen groot is. Gelukkig is er een handige methode om van breed naar lang formaat te komen.
Conversie van breed naar lang formaat Om een dataframe in breed formaat om te zetten in dataframe in lang formaat is het meest handig om de functie melt()
uit het pakket reshape2
te gebruiken.
> install.packages("reshape2")
> library(reshape2)
> df_lang <- melt(df.breed, value.name="score") Using proefpersoon as id variables > df_lang proefpersoon variable score 1 A voortoets 525 2 B voortoets 610 3 C voortoets 630 4 D voortoets 575 5 A natoets 780 6 B natoets 790 7 C natoets 840 8 D natoets 800 > names(df_lang)[2] <- "toetstype" # pas naam aan
> df_lang proefpersoon toetstype score 1 A voortoets 525 2 B voortoets 610 3 C voortoets 630 4 D voortoets 575 5 A natoets 780 6 B natoets 790 7 C natoets 840 8 D natoets 800
Conversie van lang naar breed formaat Om een dataframe in lang formaat om te zetten in dataframe in breed formaat is het meest handig om de functie dcast()
uit het pakket reshape2
te gebruiken. In ons voorbeeld kunnen we het volgende doen:
> df_breed2 <- dcast(df_lang, proefpersoon~toetstype, value.var="score")
> df_breed2
proefpersoon voortoets natoets
1 A 525 780
2 B 610 790
3 C 630 840
4 D 575 800