Cursus
Hoewel veel organisaties data opslaan in databases en opslagopties zoals AWS, Azure en GCP, worden Microsoft Excel-spreadsheets nog steeds veel gebruikt voor kleinere datasets.
De data science-functionaliteit van Excel is beperkter dan die van R, dus is het handig om data uit spreadsheets in R te kunnen importeren.
In deze tutorial behandelen we het inlezen van Excel-werkbladen (en specifieke rijen en kolommen) in R met het readxl-pakket.
Om dit te kunnen volgen, heb je basiskennis van R nodig.
Voor een algemenere gids over het importeren van veel verschillende bestandstypen in R, lees How to Import Data Into R: A Tutorial.
Het Excel-bestand
De dataset die we in R gaan inlezen is klein en heeft slechts twee tabbladen, zodat we kunnen laten zien hoe je het juiste tabblad kiest. Je vindt het bestand hier.
Het eerste tabblad is een bankmarketing-dataset met 45.211 rijen en 17 kolommen. De onderstaande screenshot komt uit het Excel-bestand “sample.xlsx” en het tabblad “bank-full”.

Het tweede tabblad is de Iris-dataset met 150 rijen en 6 kolommen en bevat informatie over irissoorten, zoals de lengte en breedte van kelk- en kroonbladen. De onderstaande screenshot komt uit hetzelfde Excel-bestand, “sample.xlsx”, en het tabblad “iris”.

Overzicht van pakketten
Deze tutorial gebruikt het readxl-pakket. Het openxlsx-pakket is een prima alternatief dat ook kan wegschrijven naar XLSX-bestanden, maar het integreert minder goed met tidyverse-pakketten zoals dplyr en tidyr.
Om Excel-bestanden te lezen met het readxl-pakket, moeten we het pakket eerst installeren en het vervolgens importeren met de functie “library”.
install.packages("readxl")
Je ziet onderstaande output in de console, wat wijst op een succesvolle installatie.
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.2/readxl_1.4.2.tgz'
Content type 'application/x-gzip' length 1545782 bytes (1.5 MB)
==================================================
downloaded 1.5 MB
The downloaded binary packages are in
/var/folders/mq/46mc_8tj06n0wh2xjkk08r140000gn/T//RtmpHIGYqM/downloaded_packages
Om “readxl”-methoden te gebruiken, voer je onderstaande opdracht uit in de R-console.
library(readxl)
Let op: het openxlsx-pakket is een ander goed alternatief om naar XLSX-bestanden te schrijven.
Het eerste werkblad lezen
Laten we alle data van het eerste werkblad, “bank-full”, inlezen met read_xlsx() en alleen het path-argument.
bank_df <- read_xlsx(path = "sample.xlsx")
De resulterende data is een tibble.

Je kunt read_excel() op dezelfde manier gebruiken als read_xlsx(), en alle argumenten die je in de volgende secties ziet werken vergelijkbaar met deze functie. read_excel() probeert te raden of je een XLSX-spreadsheet hebt of het oudere XLS-spreadsheettype.
bank_df <- read_excel(path = "sample.xlsx")

Andere werkbladen lezen
Laten we nu alle data van het tweede werkblad, dus “iris”, inlezen met de functie read_xlsx() en het sheet-argument.
iris <- read_xlsx("sample.xlsx", sheet = "iris")

Je kunt ook het bladnummer opgeven in het sheet-argument in plaats van de bladnaam.
iris2 <- read_xlsx("sample.xlsx", sheet = 1)

Specifieke rijen lezen
Laten we specifieke rijen uit een werkblad lezen door de argumenten skip en n_max in te stellen. Om de eerste paar rijen over te slaan, kun je het skip-argument gebruiken met een waarde gelijk aan het aantal rijen dat je wilt overslaan.
bank_df_s2 <- read_excel("sample.xlsx", sheet = "bank-full", skip = 2)
Houd er rekening mee dat de bovenstaande code ook de kolomkoppen overslaat. Je leert in de volgende secties hoe je kolomkoppen expliciet kunt opgeven in de functie read_xlsx().

Op vergelijkbare wijze kun je om de eerste n rijen te lezen het argument n_max opgeven in de functie read_xlsx(). Onderstaande code leest de eerste 1000 rijen van het tabblad “bank-full”.
bank_df_n1k <- read_excel("sample.xlsx", sheet = "bank-full", n_max = 1000)

Je kunt beide argumenten ook combineren om eerst een aantal rijen over te slaan en vervolgens een specifiek aantal rijen uit de resterende dataset te lezen.
Specifieke cellen lezen
Met de argumenten “skip” en “n_max” kun je een subset van de rijen van de data lezen, maar je kunt specifieke cellen uit een werkblad lezen door het argument range in te stellen.
Er zijn twee notaties om de subset van de dataset te specificeren:
- A1-notatie (E4:G8) - A staat voor de kolom en 1 staat voor het rijnummer.
- R1C1-notatie (R4C5:R8C7) - Rownummer en kolomnummer zijn expliciet gedefinieerd
Het idee is dat je de coördinaten opgeeft van de rechthoek die je uit de dataset wilt knippen.
Notatie 1:
bank_df_range1 <- read_excel("sample.xlsx", sheet = "bank-full", range = "A3:E10")
Notatie 2:
bank_df_range2 <- read_excel("sample.xlsx", sheet = "bank-full",
range = "R3C1:R10C5")
Met range kun je ook de bladnaam opnemen in het argument (voorbeeld: wbook!E4:G8).
bank_df_range3 <- read_excel("sample.xlsx", range = "bank-full!R3C1:R10C5")
Data lezen zonder header-rij
Laten we data lezen zonder header-rij door het argument col_names in te stellen op een character vector.
PS: We gebruiken eerst het skip-argument om de header-rij te verwijderen.
columns <- c("ID", "Sepal Length", "Sepal Width", "Petal Length", "Petal Width", "Species Name")
iris3 <- read_excel("sample.xlsx", sheet = 2, skip = 1, col_names = columns)

Kopnamen repareren
In de vorige sectie waren de headers die we opgaven spatiegescheiden. Je kunt kopnamen omzetten naar syntactische R-variabelen met het argument .name_repair = "universal".
iris4 <- read_excel("sample.xlsx", sheet = 2, skip = 1,
col_names = columns, .name_repair = "universal")

Kolomtypes specificeren
Standaard raadt R bij het inlezen van een Excel-bestand het datatypen van elke variabele. Laten we de kolomtypes bekijken van de iris-dataset die met de standaardargumenten is ingelezen.
sapply(iris, class)
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
"numeric" "numeric" "numeric" "numeric" "numeric" "character"
Om de gok van de kolomtypes te overschrijven, kun je het argument col_types gebruiken.
iris5 <- read_excel("sample.xlsx", sheet = 2,
col_types = c("numeric", "numeric", "numeric", "numeric", "numeric", "text"))
sapply(iris5, class)
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
"numeric" "numeric" "numeric" "numeric" "numeric" "character"

Je kunt R ook de kolomtypes van geselecteerde variabelen laten raden door voor een bepaalde kolom de waarde “guess” op te geven bij col_types.
iris6 <- read_excel("sample.xlsx", sheet = 2,
col_types = c("guess", "numeric", "numeric", "numeric", "numeric", "text"))
sapply(iris6, class)
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
"numeric" "numeric" "numeric" "numeric" "numeric" "character"

Kolommen overslaan
Je hoort vaak: hoe meer data, hoe beter. Maar in veel use-cases blijken sommige variabelen/kolommen geen enkel signaal te bevatten, bijvoorbeeld om een van de onderstaande redenen.
- hoge kardinaliteit: bijna elke waarde is anders
- nul kardinaliteit: elke waarde is hetzelfde
- niet relevant voor de businesscase
- te veel missende waarden
- te veel rommelwaarden
Je kunt het inlezen van sommige kolommen overslaan door voor col_types de waarde "skip" in te stellen, zoals hieronder gedemonstreerd.
iris7 <- read_excel("sample.xlsx", sheet = 2,
col_types = c("numeric", "skip", "skip", "numeric", "numeric", "text"))
sapply(iris7, class)
Til het naar een hoger niveau
In een wereld waarin data in een enorm tempo en in allerlei vormen wordt gegenereerd, moet je programmeertaal het lezen van deze datatypes ondersteunen. R is een van die krachtige talen die dit mogelijk maken. Schrijf je in voor de cursus “Introduction to Importing Data in R” om te leren hoe R pakketten biedt om uiteenlopende datasets te importeren. Deze cursus bevat tutorials en quizzen om je begrip van data importeren in R te versterken.
Veelgestelde vragen
Kan R voor projecten zowel CSV- als Excel-data importeren?
Ja, R kan voor projecten zowel CSV- als Excel-data importeren, en R biedt robuuste pakketten en functies om beide formaten te verwerken. Lees onze gids over CSV vs. Excel voor een gedetailleerde vergelijking en advies over de juiste keuze voor je dataprojecten.
