Chapter 5 Data bewerken
In dit hoofdstuk worden procedures besproken waarmee de gegevens in een dataset bewerkt kunnen worden. Voor deze bewerkingen maken we gebruik van het dplyr
-package.dyplr
is ook onderdeel van het tidyverse
-package.
5.1 R operators
Voordat we aan de slag gaan met het bewerken van de data, is het handig om te weten welke operators R gebruikt. Dat zijn de volgende
>
;groter dan>=
;groter of gelijk aan<
;kleiner dan<=
;kleiner of gelijk aan==
;gelijk aan!=
;niet gelijk aan
Voor het combineren van statements kunnen devolgende operators gebruikt worden
&
en|
of!
niet
5.2 Pipes
De tools die je in dit verdere hoofdstuk zult gaan gebruiken, kunnen al snel ingewikkeld ogen, omdat je ze moet opschrijven zoals je dat ook gewend bent met wiskunde: de volgorde van handelingen wordt in R bepaald met behulp van haakjes. Om code leesbaar te houden, maken we daarom vaak gebruik van zogenaamde pipes
. De pipe ziet er als volgt uit: %>%
. En kun je interpreteren als “en dan doe je”. Pipes worden ook gebruikt om code in elkaar op te kunnen laten gaan, zonder dat je daar afzonderlijke stappen voor hoeft te zetten, waarin je eerst objecten benoemd.
Laten we dan nu even kijken naar de pipe in actie. Een manier waarop de pipe veel gebruikt wordt, is door te omzeilen dat je in je code zelf aan moet geven om welke dataset het gaat. Zo moet je normaal wanneer je count()
gebruikt, de variabelen die je wilt gebruiken aangeven als data, variabele
. Wanneer je de pipe gebruikt, kun je de dataset daar weghalen. Je kunt deze code lezen als ‘Ik kies de mpg dataset en bij die dataset wil ik de code count uitvoeren bij de drv variabele’.
## # A tibble: 3 × 2
## drv n
## <fct> <int>
## 1 4 103
## 2 f 106
## 3 r 25
Dat lijkt hier misschien nog een beetje omslachtig, maar deze functie werkt ook wanneer je plaatjes maakt en die kunnen al snel best ingewikkelde code opleveren! De pipe helpt ook met het overzicht te bewaren wanneer je verschillende functies tegelijk wilt toepassen op een stuk data. Zo is de pipe heel handig als je een functie enkel over een gedeelte van de data wilt uitvoeren, dan kan je in de functie de code voor filteren verwerken.
## # A tibble: 1 × 2
## drv n
## <fct> <int>
## 1 f 106
5.3 Variabelen selecteren
Soms is voor een analyse slechts een deel van de variabelen uit de datset nodig. Het selecteren van variabelen uit de dataset kan met de code select()
. Wanneer we alleen de variabelen displ, drv en hwy willen selecten, kan dat met de volgende code:
LET OP: Voor het opslaan van de gegevens moet er nog een code als df_select <-
voor.
Het is ook mogelijk om alle variabelen behalve een aantal te selecten.
5.4 Cases filteren
Naast het selecteren van specifieke variabelen, kunnen ook specifieke cases geslecteerd worden. Dit kan met de code filter()
.
De variabele cty
verwijst naar het brandstofverbruik van de verschillende automodellen (in mijlen per gallon); laten we alleen zuinige auto’s selecteren met meer dan 20 mijl per gallon.
Door gebruik te maken van de operators, kan er voor verschillende variabelen tegelijkertijd gefilterd worden.(Let op dat je audi hier tussen aanhalingstekens zet, anders werkt de code niet).
Zo kunnen er ook verschillende automerken geselecteerd worden
Hoewel de code werkt, is hij wel vrij lang. Omdat het selecteren op basis van categorieën vaker gebeurt, is hier ook een andere code voor
5.5 Variabelen aanmaken (Mutate)
Vaak willen we een nieuwe kolom maken op basis van de informatie in andere kolommen. mutate()
is hiervoor erg handig. mutate()
maakt een nieuwe variabele, door Naam_dataframe <-
voor de functie toe te voegen, wordt de nieuwe variabele opgeslagen in de dataframe.
Laten we een gemiddelde score maken voor de twee brandstofefficiëntievariabelen (cty en hwy), deze nieuwe variabele zullen we opslaan in de dataframe mpg
:
Met behulp van mutate()
is het ook mogelijk om aanpassingen aan variabelen te maken. Er wordt een nieuw dataframe gemaakt met daarbij de extra gemaakte variabele toegevoegd. In dit geval is dat de variabele hwyREC.
5.6 Variabelen hercoderen
Hercoderen is het veranderen van de waarden van variabelen. Dit kan met de code case_when()
.
Laten we onze drv-variabele die uit drie categorieën bestaat (“f” voor voorwielaandrijving, “r” voor achterwielaandrijving en “4” voor vierwielaandrijving), veranderen in een variabele met twee categorieën (“twee” voor tweewielaandrijving en “vier” voor vierwielaandrijving):
mpg <- mpg %>% mutate(
drv_bin = case_when(
drv == "f" ~ "two",
drv == "r" ~ "two",
drv == "4" ~ "four"))
Wanneer je meerdere groepen wilt samenvoegen, kan dat via de bovenstaande code, maar het kan ook korter. Laten we voor de variabele cyl groepen samenvoegen. De variabele cyl gaat over het aantal cylinders dat aanwezig is in de auto. De antwoordopties zijn 4, 5, 6 en 8. Om de groepen 4 en 5 samen te voegen en de groepen 6 en 8 gebruiken we de volgende code:
Hercoderen kan ook met de functie ifelse()
. deze functie is handig om te gebruiken je één waarde van een variabele een score wilt geven en alle andere waarden een andere zelfde score, bijvoorbeeld bij het maken van dummy’s. In het onderstaande voorbeeld maken we een dummy van de variabele cyl waarbij alleen de oorspronkelijke score 8 een score 1 krijgt. De rest van de scores krijgt een score 0.
5.7 Variabelen sorteren
Met de functie arrange()
is het mogelijk om de data te sorteren. Wanneer je enkel deze functie gebruikt, krijg je alle variabelen in de dataset. Door gebruik te maken van print(n=...)
kan je de volledige dataset zien. Je kan de dataset ook opslaan als nieuw object.
De functie arrange()
is ook te gebruiken in combinatie met de andere bewerkingsfuncties.
5.8 Variabelen samenvatten
Met de functie summarise()
kun je de informatie in de variabelen samenvatten. Voor het gemiddelde van displ gebruik je devolgende code:
## # A tibble: 1 × 1
## `mean(displ)`
## <dbl>
## 1 3.47
In dit voorbeeld is het was omslachtig om summarise te gebruiken, maar
summarise is vooral een nuttige functie in combinatie met group_by()
. Door deze codes samen te gebruiken kun je bepaalde informatie opvragen voor verschillende categorieën van een andere variabele. In het vorige voorbeeld ging het enkel om het vinden van één gemiddelde. Nu willen we de steekproefomvang, het gemiddelde, de standaarddeviatie en de standaardfout per categorie opvragen, dan is het nuttig om een naam aan de nieuwe variabelen te geven.
mpg %>%
group_by(manufacturer) %>%
summarise(n_cty = n(),
mean_cty = mean(cty),
sd_cty = sd(cty),
se_cty = sd_cty / n_cty)
## # A tibble: 15 × 5
## manufacturer n_cty mean_cty sd_cty se_cty
## <chr> <int> <dbl> <dbl> <dbl>
## 1 audi 18 17.6 1.97 0.110
## 2 chevrolet 19 15 2.92 0.154
## 3 dodge 37 13.1 2.49 0.0672
## 4 ford 25 14 1.91 0.0766
## 5 honda 9 24.4 1.94 0.216
## 6 hyundai 14 18.6 1.50 0.107
## 7 jeep 8 13.5 2.51 0.313
## 8 land rover 4 11.5 0.577 0.144
## 9 lincoln 3 11.3 0.577 0.192
## 10 mercury 4 13.2 0.5 0.125
## 11 nissan 13 18.1 3.43 0.264
## 12 pontiac 5 17 1 0.2
## 13 subaru 14 19.3 0.914 0.0653
## 14 toyota 34 18.5 4.05 0.119
## 15 volkswagen 27 20.9 4.56 0.169
Er kan ook een tweede group_by()
variabele toegevoegd worden.
mpg %>%
group_by(drv, year) %>%
summarise(n_cty = n(),
mean_cty = mean(cty),
sd_cty = sd(cty),
se_cty = sd_cty / n_cty)
## # A tibble: 6 × 6
## # Groups: drv [3]
## drv year n_cty mean_cty sd_cty se_cty
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 4 1999 49 14.2 2.56 0.0523
## 2 4 2008 54 14.4 3.15 0.0584
## 3 f 1999 57 20.0 4.09 0.0718
## 4 f 2008 49 20.0 3.04 0.0621
## 5 r 1999 11 14 2.76 0.251
## 6 r 2008 14 14.1 1.79 0.128
5.9 Missende waarden
In empirisch onderzoek komt het regelmatig voor dat gegevens ontbreken omdat respondenten, bijvoorbeeld, vragen weigeren te beantwoorden, helemaal niet mee willen doen of per ongeluk een vraag overslaan. Dit leidt tot gaten in de dataset. R vult deze gaten op met NA
(not available). In sommige gevallen kunnen daarom bepaalde bewerkingen of analyses niet worden uitgevoerd.
is.na()
is een functie die je vertelt of een bepaalde waarde missing is of niet.
## [1] FALSE FALSE FALSE TRUE FALSE
We kunnen dezelfde functie gebruiken binnen de code van filter()
. De mpg-dataset heeft geen ontbrekende waarden, dus laten we ons eigen dataframe maken. Naast vector b
, maken we ook nog een tweede vector c
. en van deze variabelen maken we een dataframe.
## ID b c
## 1 1 2 NA
## 2 2 4 12
## 3 3 5 5
## 4 4 NA 9
## 5 5 8 14
Nu kan er een filter worden toegepast waarmee alleen de cases zonder NA geselecteerd worden. In dit voorbeeld filteren we de cases met missende waaarden van variabele b.
## ID b c
## 1 1 2 NA
## 2 2 4 12
## 3 3 5 5
## 4 5 8 14
De case met een missende waarde op variabele b, de case met ID score 4, is nu weggefilterd, maar er zit nog wel een missende waarde in variabele c. Door een &
toe te voegen en nogmaals !is.na()
kunnen er meerder variabelen toegevoegd worden. Uiteindelijk krijg je dan een dataset met alleen de cases die op alle variabelen die je aangegeven hebt een geldige score hebben.
## ID b c
## 1 2 4 12
## 2 3 5 5
## 3 5 8 14
Dit kan ook nog op twee andere manieren. Als eerste kan het ook met complete.cases(.)
.
## ID b c
## 1 2 4 12
## 2 3 5 5
## 3 5 8 14
Ten tweede kan het ook met na.omit()
.
## ID b c
## 2 2 4 12
## 3 3 5 5
## 5 5 8 14
5.10 Gewogen waarden
Soms komt het voor dat er in een dataframe gebruikt gemaakt wordt van een frequentie variabele die aangeeft hoevaak de een variabele of een combinatie van variabelen voorkomt. In dat geval moet je de data wegen met behulp van de code uncount()
.
In het onderstaande voorbeeld wordt wordt een dataframe gemaakt met daarin verschillende combinatie’s tussen letters en cijfers. De freq-variabele geeft aan hoevaak iedere combinatie voorkomt.
Voorbeeld_wegen <- tibble(x = c("a", "a", "b", "b"), y= c(1,2,3,4), freq = c(1, 3, 2, 3))
print(Voorbeeld_wegen)
## # A tibble: 4 × 3
## x y freq
## <chr> <dbl> <dbl>
## 1 a 1 1
## 2 a 2 3
## 3 b 3 2
## 4 b 4 3
Wanneer we de data nog niet gewogen hebben, zien we dat er vier cases in de dataset zitten. Door de functie uncount()
te gebruiken krijgt de dataset negen cases en wordt er dus rekening gehouden met de frequentie variabele. Binnen de functie wordt het dataframe en de variabele die de frequenties aangeeft weergeven.
## # A tibble: 9 × 2
## x y
## <chr> <dbl>
## 1 a 1
## 2 a 2
## 3 a 2
## 4 a 2
## 5 b 3
## 6 b 3
## 7 b 4
## 8 b 4
## 9 b 4
5.11 Betrouwbaarheid van een schaal
Voor het doen van statistisch onderzoek is het vaak relevant om twee of meerdere variabelen samen te voegen, dit wordt ook wel het construeren van een schaal genoemd. Hierbij is het van belang dat de betrouwbaarheid van deze nieuwe schaal gemeten wordt. Dit kan met behulp van de cronbach alpha via de functie cronbach.alpha()
uit het ltm-package
. Let op: bij een onderzoek voeg je variabelen samen op basis van bijvoorbeeld de theorie, in het volgende voorbeeld is dat niet gedaan.
In het volgende voorbeeld willen we een schaal maken van de variabelen cty en hwy welke beide informatie geven over de hoeveelheid mijlen die gereden kunnen worden per gallon. Om de cronbach’s alpha te berekenen moet eerst een dataframe gemaakt worden van de items van de schaal. Daarna kunnen we de functie cronbach.alpha()
gebruiken.
##
## Cronbach's alpha for the 'mijlen_per_gallon' data-set
##
## Items: 2
## Sample units: 234
## alpha: 0.95
De cronbach alpha heeft een waarde van 0.95, wat aangeeft dat het een betrouwbare schaal is en deze variabelen goed samengevoegd kunnen worden voor verder onderzoek.