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).

Tip

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:

library(rio) 
deniro_data <- import("deniro.csv") 

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:

deniro_data <- as_tibble(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 en Title. 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 functie where en is.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:

new_deniro_data <- 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)
Waarschuwing

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:

canada <- import("2019 Canadian Election Study.rds")

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.

Tip

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 van c()).

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:

new_canada <- 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.

Tip

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>.