Deel 3
Data manipulatie met dplyr
22/04/2022
dplyr
pakket --- (doorklikken)tidyverse
tidyverse
?handig voor beginners
consistente benadering voor alles
krachtige mogelijkhede met een minimum aan 'effort'
geeft vertrouwen om R
verder te exploreren
In R
werken we normaal met een dataframe.
Binnen het tidyverse
ecosysteem werken we met een variant: een tibble
Een tibble is eigenlijk een dataframe volgens het tidy data principe
RIASEC
## # A tibble: 6,578 × 100## R1 R2 R3 R4 R5 R6 R7 R8 I1 I2 I3 I4 I5## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 1 1 1 1 1 1 1 1 2 4 2 2 1## 2 1 1 1 1 1 1 1 1 4 2 3 2 3## 3 5 3 1 1 1 1 2 2 4 4 4 2 4## 4 1 2 1 2 2 3 2 2 4 5 4 4 4## 5 1 1 5 1 1 2 1 1 4 4 4 4 4## 6 3 1 1 2 1 2 2 3 3 4 4 2 1## 7 1 1 1 1 1 1 1 1 3 4 3 1 1## 8 5 1 1 4 5 1 3 3 3 2 4 4 4## 9 1 1 1 1 1 1 1 1 3 4 2 3 2## 10 5 4 2 4 2 3 3 3 5 5 2 5 2## # … with 6,568 more rows, and 87 more variables: I6 <dbl>, I7 <dbl>, I8 <dbl>,## # A1 <dbl>, A2 <dbl>, A3 <dbl>, A4 <dbl>, A5 <dbl>, A6 <dbl>, A7 <dbl>,## # A8 <dbl>, S1 <dbl>, S2 <dbl>, S3 <dbl>, S4 <dbl>, S5 <dbl>, S6 <dbl>,## # S7 <dbl>, S8 <dbl>, E1 <dbl>, E2 <dbl>, E3 <dbl>, E4 <dbl>, E5 <dbl>,## # E6 <dbl>, E7 <dbl>, E8 <dbl>, C1 <dbl>, C2 <dbl>, C3 <dbl>, C4 <dbl>,## # C5 <dbl>, C6 <dbl>, C7 <dbl>, C8 <dbl>, introelapse <dbl>,## # testelapse <dbl>, surveyelapse <dbl>, TIPI1 <dbl>, TIPI2 <dbl>, …
Artwork by @allison_horst
Artwork by @allison_horst
Artwork by @allison_horst
dplyr
pakketdplyr
...is HET pakket om te werken met tidy data !
WERKWOORDEN staan centraal:
filter()
mutate()
select()
group_by() + summarise()
arrange()
rename()
relocate()
join()
%>%
operator (een 'pipe')
Om functies
aaneen te schakelen
In plaats van
mean(c(1,2,3,4))
of
Getallen <- c(1,2,3,4)mean(Getallen)
doe je
c(1,2,3,4) %>% mean( )
Met de %>%
kan je volgende zin schrijven:
I
%>%
woke up%>%
took a shower%>%
got breakfast%>%
took the metro%>%
arrived at work%>%
…
filter()
Artwork by @allison_horst
filter()
toegepastMet de RIASEC data:
We selecteren enkel observaties van mannen uit GB
RIASEC_UK_Male <- RIASEC %>% filter(country == "GB" & gender == 1)
==
staat voor is gelijk aan (let op de 2 = tekens!)
We cleanen de data en weerhouden enkel observaties waarvoor de leeftijd lager is dan 110 en gender niet de onmogelijke code 0 heeft
RIASEC_clean <- RIASEC %>% filter(age < 110 $ gender != 0)
!=
staat voor is niet gelijk aan
mutate()
Artwork by @allison_horst
mutate()
toegepastMet de RIASEC data:
We berekenen scores voor de 6 kerndimensies van het RIASEC model en overschrijven de RIASEC dataset (zo hebben we de kolommen toegevoegd aan de dataset)
RIASEC <- RIASEC %>% mutate( Realistic = (R1 + R2 + R3 + R4 + R5 + R6 + R7 + R8)/8, Investigative = (I1 + I2 + I3 + I4 + I5 + I6 + I7 + I8)/8, Artistic = (A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8)/8, Social = (S1 + S2 + S3 + S4 + S5 + S6 + S7 + S8)/8, Enterprising = (E1 + E2 + E3 + E4 + E5 + E6 + E7 + E8)/8, Conventional = (C1 + C2 + C3 + C4 + C5 + C6 + C7 + C8)/8 )
mutate()
toegepastMet de RIASEC data:
We zetten de variabele land om in een factor
RIASEC <- RIASEC %>% mutate( country_factor = as.factor(country) )str(RIASEC$country_factor)
## Factor w/ 3 levels "BE","GB","NL": 3 2 2 2 2 2 1 1 2 2 ...
select()
toegepastAangeven welke variabelen je wenst te selecteren.
Enkele voorbeelden met de RIASEC data:
We selecteren enkel
country
,age
,gender
en dan tonen we de structuur viastr()
RIASEC %>% select( country, age, gender ) %>% str()
## tibble [6,578 × 3] (S3: tbl_df/tbl/data.frame)## $ country: chr [1:6578] "NL" "GB" "GB" "GB" ...## $ age : num [1:6578] 46 21 20 41 22 34 28 20 52 30 ...## $ gender : num [1:6578] 2 2 1 2 1 2 2 1 2 1 ...
select()
toegepastWe selecteren enkel
country
,age
,gender
, en de nieuw berekende variabelen (Realistic tot en met Conventional) en dan tonen we de structuur viastr()
RIASEC %>% select( country, age, gender, Realistic:Conventional ) %>% str()
## tibble [6,578 × 9] (S3: tbl_df/tbl/data.frame)## $ country : chr [1:6578] "NL" "GB" "GB" "GB" ...## $ age : num [1:6578] 46 21 20 41 22 34 28 20 52 30 ...## $ gender : num [1:6578] 2 2 1 2 1 2 2 1 2 1 ...## $ Realistic : num [1:6578] 1 1 2 1.88 1.62 ...## $ Investigative: num [1:6578] 2.25 2.5 3.5 3.88 4 ...## $ Artistic : num [1:6578] 3.88 4.12 1.62 4 2.62 ...## $ Social : num [1:6578] 3.62 3.38 1.5 4.25 1 ...## $ Enterprising : num [1:6578] 1.25 1.5 1.38 2.38 1.75 ...## $ Conventional : num [1:6578] 1 1 3.5 1.25 1.5 ...
group_by() + summarize( )
group_by()
zet een tibble om naar een 'gegroepeerde tibble' waarbij alle bewerkingen op groepsniveau gebeuren
summarize()
om per groep zaken te berekenen
Per land berekenen we de gemiddelde leeftijd en de standaardafwijking
RIASEC %>% group_by( country ) %>% summarize( mean_age = mean(age), sd_age = sd(age) )
## # A tibble: 3 × 3## country mean_age sd_age## <chr> <dbl> <dbl>## 1 BE 28.8 10.6## 2 GB 34.3 18.9## 3 NL 29.2 11.9
group_by() + summarize( )
Per combinatie van land en gender berekenen we de gemiddelde leeftijd en de standaardafwijking
RIASEC %>% group_by( country, gender ) %>% summarize( mean_age = mean(age), sd_age = sd(age) )
## # A tibble: 11 × 4## # Groups: country [3]## country gender mean_age sd_age## <chr> <dbl> <dbl> <dbl>## 1 BE 0 24 NA ## 2 BE 1 30.8 11.7 ## 3 BE 2 27.8 9.77## 4 BE 3 21.7 4.73## 5 GB 0 45 19.5 ## 6 GB 1 36.5 14.0 ## 7 GB 2 32.8 13.3 ## 8 GB 3 49.3 151. ## 9 NL 1 31.3 12.6 ## 10 NL 2 28.0 11.2 ## 11 NL 3 19.1 3.85
mutate() + case_when( )
Artwork by @allison_horst
mutate() + case_when( )
We maken een nieuwe variabele
age_group
met 3 groepen, vervolgens selecteren we enkel deage
enage_group
om vervolgens enkel de bovenste 5 observaties te tonen...
RIASEC %>% mutate( age_group = case_when( age < 19 ~ 'minderjarig', age >= 18 & age < 67 ~ 'actieve bevolking', age >= 67 ~ 'gepensioneerd' ) ) %>% select( age, age_group ) %>% head(5)
## # A tibble: 5 × 2## age age_group ## <dbl> <chr> ## 1 46 actieve bevolking## 2 21 actieve bevolking## 3 20 actieve bevolking## 4 41 actieve bevolking## 5 22 actieve bevolking
x == y
→ 'x is gelijk aan y'
x != y
→ 'x is NIET gelijk aan y'
x < y
→ 'x is kleiner dan y'
x <= y
→ 'x is kleiner dan of gelijk aan y'
x > y
→ 'x is groter dan y'
x >= y
→ 'x is groter dan of gelijk aan y'
Handig om weten is dat je condities kan combineren!
&
→ 'en' → bv: gender == 1 & age <=18
|
→ 'of' → bv: gender == 1 | gender == 2
!
→ 'niet' → bv: gender == 1 & !age <=18
dplyr()
Wil je wat referentiemateriaal en een plek om je skills te oefenen? Deze tutorial (gemaakt met het pakket learnr
) is een echte aanrader!
https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome
dplyr
Op Dropbox vind je een document Oefening_dplyr.Rmd
Plaats dit document in de RIASEC_project/Output
map op je pc
Open vervolgens het bestand binnen je R project
Het document bevat een set van opdrachten met telkens lege code blokken
Bedoeling is dat je de juiste code schrijft (en test door te laten lopen) om deze opdrachten uit te voeren
Zit je vast? No Worries!
Oefening_dplyr_oplossing.Rmd
dplyr
pakket --- (doorklikken)Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |