library(rio)
<- import("deniro.csv") deniro_data
2 Filteren, selecteren en hernoemen
In dit hoofdstuk introduceren we een aantal belangrijke technieken die je zullen helpen bij het werken met bestaande datasets en het opzetten van je eigen datasets. Het gaat erom hoe je specifieke kolommen/variabelen selecteert, hoe je casussen filtert en hoe je variabelen hernoemt.
We zullen ze illustreren aan de hand van verschillende datasets. Eén ervan is het bestand ‘deniro.csv’ (beschikbaar hier) dat Rotten Tomato beoordelingen van films met Robert De Niro bevat. Er zijn 87 records. Voor elk record weten we Jaar (Year
), Waardering (Score
) en Titel (Title
).
Zorg ervoor dat je het bestand opslaat in je projectmap, want daar zoekt R het bestand als je het opent.
Je kunt deze dataset in R importeren met de volgende code:
We kunnen de eerste zes rijen van de dataset bekijken met de functie head()
:
head(deniro_data)
Year Score Title
1 1968 86 Greetings
2 1970 17 Bloody Mama
3 1970 73 Hi, Mom!
4 1971 40 Born to Win
5 1973 98 Mean Streets
6 1973 88 Bang the Drum Slowly
2.1 Tibbles
In hoofdstuk 1 kwamen we al (data frames) tegen. Dataframes zijn een van de ‘originele’ manieren in R om met gegevens te werken. Maar door de manier waarop ze worden weergegeven, kan het soms moeilijk zijn om gegevens erin te veranderen en de inhoud ervan af te drukken.
Een tibble
, of tbl_df
, is een moderne ‘versie’ van het dataframe. Tibbles hebben een verfijnde afdrukmethode die standaard alleen de eerste 10 rijen toont, en alle kolommen die op het scherm passen. Tibbles zijn daarom gemakkelijker te gebruiken als je grote datasets hebt die complexe objecten bevatten. Hoewel de hier gebruikte dataset niet bijzonder complex is, is het zinvol om aan tibbles te wennen.
Om met tibbles te kunnen werken, moet je tidyverse installeren install.packages("tidyverse")
(reeds gedaan op universiteitscomputers). We kunnen de tidyverse packages laden door te typen:
library(tidyverse)
Om onze dataset om te zetten in een tibble, kunnen we schrijven:
<- as_tibble(deniro_data) deniro_data
deniro_data <- as_tibble(deniro_data)
-
Met deze code veranderen we het bestaande object
deniro_data
in een tibble, een dataframe met class tbl_df. Als je met een eigen dataset werkt, moet je de naam aanpassen.
Als we nu deniro_data
openen zien we dat de manier waarop het dataframe wordt weergegeven is veranderd. Merk op dat er inhoudelijk niets is veranderd. Alle oorspronkelijke variabelen en waarden zijn nog steeds hetzelfde. Het is alleen een visuele verandering:
deniro_data
# A tibble: 87 × 3
Year Score Title
<int> <int> <chr>
1 1968 86 Greetings
2 1970 17 Bloody Mama
3 1970 73 Hi, Mom!
4 1971 40 Born to Win
5 1973 98 Mean Streets
6 1973 88 Bang the Drum Slowly
7 1974 97 The Godfather, Part II
8 1976 41 The Last Tycoon
9 1976 99 Taxi Driver
10 1977 47 1900
# ℹ 77 more rows
2.2 Het selecteren van variabelen
Zodra we onze dataset hebben geladen, kunnen we variabelen selecteren. Als we bijvoorbeeld de kolommen (variabelen) betreffende het publicatiejaar (Year
) en de titel van de film (Title
) willen selecteren, kunnen we schrijven:
|>
deniro_data select(Year, Title)
# A tibble: 87 × 2
Year Title
<int> <chr>
1 1968 Greetings
2 1970 Bloody Mama
3 1970 Hi, Mom!
4 1971 Born to Win
5 1973 Mean Streets
6 1973 Bang the Drum Slowly
7 1974 The Godfather, Part II
8 1976 The Last Tycoon
9 1976 Taxi Driver
10 1977 1900
# ℹ 77 more rows
deniro_data |>
-
Dit deel van de code haalt één of meerdere kolommen uit
deniro_data
. Merk op dat we de native pipe operator (|>
) gebruiken, zie Paragraaf 1.8. select(Year, Title)
-
Hier selecteren we twee kolommen van de tibble, genaamd
Year
enTitle
. Merk op dat we, omwille van de stijl, voorstellen om nieuwe opdrachten in een pipe op de volgende regel te zetten (zie overzicht van week 2)
Er zijn verschillende speciale functies die binnen select()
gebruikt kunnen worden. Het is mogelijk een functie toe te passen op de kolommen en bijvoorbeeld alleen numerieke kolommen te selecteren:
|>
deniro_data select(where(is.numeric))
# A tibble: 87 × 2
Year Score
<int> <int>
1 1968 86
2 1970 17
3 1970 73
4 1971 40
5 1973 98
6 1973 88
7 1974 97
8 1976 41
9 1976 99
10 1977 47
# ℹ 77 more rows
deniro_data |>
-
Dit deel van de code haalt één of meerdere kolommen uit
deniro_data
. Merk op dat we de native pipe operator (|>
) gebruiken, zie Paragraaf 1.8. select(where(is.numeric))
-
Hier selecteren we alleen de kolommen in
deniro_data
die numeriek zijn, met behulp van de functiewhere
enis.numeric
.
select()
kan ook worden gebruikt om kolommen uit een tibble of dataframe te verwijderen. Hiervoor gebruiken we het min-teken:
|>
deniro_data select(-Year, -Title)
# A tibble: 87 × 1
Score
<int>
1 86
2 17
3 73
4 40
5 98
6 88
7 97
8 41
9 99
10 47
# ℹ 77 more rows
Merk op dat tot dusver geen van de wijzigingen “permanent” is, omdat het resulterende gegevensframe (tibble) niet wordt “gemaakt” (toegewezen aan een object), maar alleen wordt afgedrukt. Je vraagt R de opdracht uit te voeren in de bestaande dataset en het resultaat af te drukken (niet op te slaan). Als je een variabele permanent wilt selecteren (of verwijderen), moet je een nieuw object maken. Dus als je bijvoorbeeld alleen de kolommen (variabelen) Jaar en Filmtitel wilt behouden in een nieuwe versie van de dataset (new_deniro_data
), dan moet je schrijven:
<- deniro_data |>
new_deniro_data select(Year, Title)
new_deniro_data <-
-
Dit deel van de code maakt een nieuw object genaamd “new_deniro_data”.
deniro_data |> select(Year, Title)
-
Dit deel van de code haalt één of meerdere kolommen uit een dataset.
Merk op dat je niet altijd een nieuwe dataset hoeft te maken. Als je de bestaande dataset wilt wijzigen, wijs je het resultaat toe aan een object met dezelfde naam:
<- deniro_data |>
deniro_data select(Year, Title)
Dit zal de bestaande deniro_data
(zoals deze in het werkgeheugen van R is bewaard) overschrijven met de wijzigingen. Als je terug wilt naar de oorspronkelijke dataset, moet je het bestand opnieuw importeren.
2.3 Casussen filteren
De functie filter()
wordt gebruikt om de rijen te filteren. Bijvoorbeeld Canadese kiezers die ouder zijn dan 50.
Er zijn een aantal belangrijke functies en operatoren die nuttig zijn bij het samenstellen van de expressies die worden gebruikt om de gegevens te filteren:
==
betekent ‘gelijk aan’.!=
betekent ‘niet gelijk aan’.<
betekent ‘kleiner dan’.>
betekent ‘groter dan’.<=
betekent ‘gelijk aan of kleiner dan’.>=
betekent ‘gelijk aan of groter dan’.&
betekent ‘EN’.|
betekent ‘OF’.!
betekent ‘NIET’.%in%
wordt gebruikt om één van meerdere waarden te selecteren.
Om het gebruik van sommige daarvan te illustreren, gebruiken we de dataset van de Canadian Election Study 2019:
<- import("2019 Canadian Election Study.rds") canada
We zetten het dataframe om in een tibble en selecteren voor de overzichtelijkheid slechts een paar variabelen:
<- canada |>
canada as_tibble() |>
select(cps19_gender, cps19_age, cps19_bornin_other)
Laten we aannemen dat we willen filteren op één of meer criteria. Voor een character variable zouden we schrijven:
|>
canada filter(cps19_bornin_other == "UNITED STATES")
# A tibble: 407 × 3
cps19_gender cps19_age cps19_bornin_other
<fct> <dbl> <fct>
1 A man 25 UNITED STATES
2 A man 68 UNITED STATES
3 A man 63 UNITED STATES
4 A woman 36 UNITED STATES
5 A woman 71 UNITED STATES
6 A woman 59 UNITED STATES
7 A woman 47 UNITED STATES
8 A woman 64 UNITED STATES
9 A woman 65 UNITED STATES
10 A man 88 UNITED STATES
# ℹ 397 more rows
filter(cps19_bornin_other == "UNITED STATES")
-
De functie
filter()
wordt gebruikt om een dataframe te filteren, waarbij alle rijen die aan de voorwaarden voldoen worden behouden. Hier vragen we naar respondenten die geboren zijn in de Verenigde Staten.
Een fout die mensen vaak maken bij het filteren van character variables is dat ze de aanhalingstekens vergeten.
Als we meerdere geboortelanden willen selecteren, kunnen we gebruik maken van %in%
. Hier selecteren we mensen die geboren zijn in Vietnam of Oekraïne:
|>
canada filter(cps19_bornin_other %in% c("vietnam", "ukraine")) # Spelling has to match how it appears in the dataset
# A tibble: 120 × 3
cps19_gender cps19_age cps19_bornin_other
<fct> <dbl> <fct>
1 A man 69 ukraine
2 A man 81 ukraine
3 A woman 30 ukraine
4 A man 19 vietnam
5 A woman 42 ukraine
6 A man 41 ukraine
7 A woman 38 ukraine
8 A woman 43 ukraine
9 A man 55 ukraine
10 A man 51 ukraine
# ℹ 110 more rows
filter(cps19_bornin_other %in% c("vietnam", "ukraine"))
-
De functie
filter()
wordt gebruikt om een dataframe te filteren, waarbij alle rijen die aan de voorwaarden voldoen worden behouden. In dit geval selecteren we alle respondenten die in Vietnam of Oekaïne zijn geboren. Let op dat je de lijst van opties als vector noteert (met behulp vanc()
).
Voor een numerieke variabele (zoals lengte) gebruiken we de aanhalingstekens niet. Als we bijvoorbeeld respondenten willen selecteren uit de Verenigde Staten van 30 jaar of ouder:
|>
canada filter(cps19_bornin_other == "UNITED STATES" & cps19_age >= 30)
# A tibble: 347 × 3
cps19_gender cps19_age cps19_bornin_other
<fct> <dbl> <fct>
1 A man 68 UNITED STATES
2 A man 63 UNITED STATES
3 A woman 36 UNITED STATES
4 A woman 71 UNITED STATES
5 A woman 59 UNITED STATES
6 A woman 47 UNITED STATES
7 A woman 64 UNITED STATES
8 A woman 65 UNITED STATES
9 A man 88 UNITED STATES
10 A man 72 UNITED STATES
# ℹ 337 more rows
filter(cps19_bornin_other == "UNITED STATES" & cps19_age >= 30)
-
De functie
filter()
wordt gebruikt om een dataframe te filteren, waarbij alle rijen die aan de voorwaarden voldoen worden behouden. Hier vragen we om geboorteland Verenigde Staten en een leeftijd van 30 jaar of ouder.
Als je respondenten wilt filteren die geboren zijn in Vietnam of jonger zijn dan 25, gebruik je:
|>
canada filter(cps19_bornin_other == "Vietnam" | cps19_age < 25)
# A tibble: 2,858 × 3
cps19_gender cps19_age cps19_bornin_other
<fct> <dbl> <fct>
1 A woman 21 <NA>
2 A woman 19 <NA>
3 A man 21 <NA>
4 A woman 19 <NA>
5 A woman 20 <NA>
6 A woman 21 albania
7 A woman 21 <NA>
8 A woman 21 <NA>
9 A man 19 <NA>
10 A woman 19 <NA>
# ℹ 2,848 more rows
Je kunt de bovengenoemde uitdrukkingen toepassen om de data te filteren. De “!” operator werkt een beetje anders, omdat hij alle gevallen selecteert die niet aan een voorwaarde voldoen. Dus, als we bijvoorbeeld alle casussen willen filteren die niet in de Verenigde Staten zijn geboren, zouden we schrijven:
|>
canada filter(!(cps19_bornin_other == "UNITED STATES"))
# A tibble: 5,639 × 3
cps19_gender cps19_age cps19_bornin_other
<fct> <dbl> <fct>
1 A woman 21 albania
2 A woman 19 colombia
3 A woman 20 india
4 A woman 19 kenya
5 A woman 19 philippines
6 A woman 22 georgia
7 A man 19 philippines
8 A woman 19 afghanistan
9 A woman 21 pakistan
10 A woman 19 philippines
# ℹ 5,629 more rows
filter(!(cps19_bornin_other == "UNITED STATES"))
-
De functie
filter()
wordt gebruikt om een dataframe te filteren, waarbij alle rijen die aan de voorwaarden voldoen worden behouden. Hier vragen we alleen gevallen te selecteren die NIET in de Verenigde Staten zijn geboren. Merk op dat we een uitroepteken voor de conditie zetten en dat de conditie tussen haakjes staat.
Merk nogmaals op dat geen van de wijzigingen “permanent” is. Je vraagt R gewoon om de opdracht ‘tijdelijk’ uit te voeren in de bestaande dataset. Als je permanent wilt filteren, moet je een nieuw object maken (of toewijzen aan het huidige object). Dus, bijvoorbeeld, als je bijvoorbeeld een dataset wilt maken met alleen de antwoorden van mensen die hun gender niet als man of vrouw omschrijven:
<- canada |>
new_canada filter(cps19_gender == "Other (e.g. Trans, non-binary, two-spirit, gender-queer)")
new_canada <-
-
Dit deel van de code maakt een nieuw object genaamd
new_canada
. canada |>
-
Dit deel van de code neemt
canada
als het begin van onze pipe. filter(cps19_gender == "Other (e.g. Trans, non-binary, two-spirit, gender-queer)")
-
Dit deel van de code onderwerpt een dataframe aan de opgegeven voorwaarde.
Een fout die mensen vaak maken in filters is het gebruik van slechts één is-gelijk-teken =, waar er twee == zouden moeten staan.
2.4 Variabelen hernoemen
Om de namen van individuele variabelen te veranderen gebruiken we de rename()
functie. Deze gebruikt de volgorde nieuwe_naam = oude_naam
om geselecteerde variabelen te hernoemen.
Als we de kolom cps19_age
uit dataset canada
willen hernoemen naar age
, zou je schrijven:
|>
canada rename(age = cps19_age)
# A tibble: 37,822 × 3
cps19_gender age cps19_bornin_other
<fct> <dbl> <fct>
1 A woman 30 <NA>
2 A woman 21 <NA>
3 A woman 19 <NA>
4 A man 21 <NA>
5 A woman 19 <NA>
6 A woman 20 <NA>
7 A woman 21 albania
8 A woman 21 <NA>
9 A woman 21 <NA>
10 A man 19 <NA>
# ℹ 37,812 more rows
Zoals hierboven is opgemerkt, is dit echter geen permanente wijziging. Daarvoor moeten we ervoor zorgen dat het in het bestaande dataframe wordt gewijzigd:
<- canada |>
canada rename(age = cps19_age)
canada <- canada |>
-
Dit deel van de code overschrijft het bestaande dataframe
canada
. rename(age = cps19_age)
-
Dit deel van de code hernoemt een variabele met het algemene patroon:
<nieuwe_naam> = <oude_naam>
.