Cursus
Bijna elk R-data-analyseproject vereist dat je specifieke rijen, kolommen of waarden uit een grotere dataset haalt. Subsetten is hoe je dat in R doet: met bracketnotatie [] voor laagdrempelige indexeercontrole, de functie subset() voor leesbare, voorwaardelijke filtering, of dplyr-werkwoorden zoals filter() en select() voor moderne datapijplijnen.
TL;DR
-
Gebruik bracketnotatie
df[rows, cols]voor positi gebaseerde selectie van rijen en kolommen -
Gebruik
$om één kolom als vector te extraheren:df$column_name -
Gebruik
subset(df, condition)voor leesbare, voorwaardelijke filtering in interactieve sessies -
Voeg
drop = FALSEtoe wanneer je één kolom selecteert om het resultaat als data frame te behouden -
Geef voor productietcode en datapijplijnen de voorkeur aan bracketnotatie of
dplyr::filter()bovensubset()
Rijen selecteren
Hier is een voorbeeld van subsetten op een data frame genaamd debt.
debt[3:6, ]
name payment
3 Dan 150
4 Rob 50
5 Rob 75
6 Rob 100
De syntaxis df[rows, columns] is de basis van subsetten in R. Hier selecteert 3:6 de rijen 3 t/m 6, en de lege ruimte na de komma betekent "geef alle kolommen terug". Het resultaat is een kleiner data frame met dezelfde kolomstructuur als het origineel.
Rijen selecteren uit een specifieke kolom
Let op de vereenvoudiging die optreedt wanneer je één enkele kolom selecteert. Als je de eerste drie rijen van alleen de kolom payment selecteert, wordt het resultaat vereenvoudigd tot een vector.
debt[1:3, 2]
100 200 150
De 2 verwijst hier naar de tweede kolom van debt, namelijk payment. Omdat we één kolom selecteerden, laat R de dataframe-structuur vallen en geeft een gewone numerieke vector terug.
Dataframe-opmaak
Wil je het als dataframe behouden, voeg dan simpelweg drop = FALSE toe zoals hieronder:
debt[1:3, 2, drop = FALSE]
payment
1 100
2 200
3 150
Een specifieke kolom selecteren
Je kunt ook één kolom selecteren met de $-operator door dataframe$column te schrijven. In het volgende voorbeeld halen we de kolom payment uit debt. R geeft het resultaat terug als een vector in plaats van een data frame.
debt$payment
100 200 150 50 75 100
De functie subset() gebruiken
Als je complexere subsets wilt maken of een subset op basis van een voorwaarde, is de volgende stap de functie subset(). Stel dat je de schulden van iemand met de naam Dan wilt bekijken. Je zou gewoon de brackets kunnen gebruiken om zijn schuld te selecteren en op te tellen, maar dat is niet erg robuust, zeker niet bij mogelijke wijzigingen in de dataset.
# Dit werkt, maar is niet informatief
debt[1:3, ]
subset() op een categorische variabele
Een betere manier is om de functie subset() te gebruiken om de rijen te selecteren waar de kolom name gelijk is aan Dan. Let op dat er een dubbele is-gelijkteken (==) nodig is, een relationele operator.
# Dit werkt, maar is niet informatief en niet robuust
debt[1:3, ]
# Veel informatiever!
subset(debt, name == "Dan")
name payment
1 Dan 100
2 Dan 200
3 Dan 150
Het resultaat bevat alleen de drie rijen waar name gelijk is aan "Dan". Merk op dat de oorspronkelijke rijnummers (1, 2, 3) behouden blijven, wat helpt om resultaten terug te leiden naar het bron-dataframe.
subset() op een numerieke variabele
We kunnen ook subsetten op numerieke kolommen. Als we rijen willen zien waar payments gelijk zijn aan $100, doe je het volgende:
subset(debt, payment == 100)
name payment
1 Dan 100
6 Rob 100
Twee rijen voldoen aan de voorwaarde: rij 1 (Dan) en rij 6 (Rob) hebben allebei betalingen van exact $100. Dit laat zien dat subset() elke rij scant, ongeacht de naam, en alle overeenkomsten teruggeeft.
Dataframes benaderen en subsetten
Wat als je alleen de kasstromen van bedrijf A nodig hebt? Hier filtert de functie subset() rijen uit een ander dataframe, cash:
subset(cash, company == "A")
company cash_flow year
1 A 1000 1
2 A 4000 3
3 A 550 4
Onthoud:
-
Het eerste argument dat je aan
subset()doorgeeft is de naam van je dataframe,cash. -
Let op dat je
companyniet tussen aanhalingstekens moet zetten! -
De
==is de gelijkheidsoperator. Die test waar twee dingen gelijk zijn en geeft een logische vector terug.
Interactief voorbeeld van de subset()-methode
In het volgende voorbeeld gebruiken we subset() om rijen van cash te selecteren die horen bij bedrijf B, en filteren we vervolgens op kasstromen die over 1 jaar vervallen.
# Rijen over bedrijf B
subset(cash, company == "B")
# Rijen met kasstromen die over 1 jaar vervallen
subset(cash, year == 1)
Als je bovenstaande code uitvoert, levert dat het volgende resultaat op:
company cash_flow year
4 B 1500 1
5 B 1100 2
6 B 750 4
7 B 6000 5
company cash_flow year
1 A 1000 1
4 B 1500 1
Probeer het zelf in onze cursus Introduction to R for Finance.
Deze content is afkomstig uit DataCamp’s cursus Introduction to R for Finance door Lore Dirick.
Subsetten met dplyr
Het tidyverse-pakket dplyr biedt een modern alternatief voor het subsetten van dataframes. De functie filter() selecteert rijen en select() kiest kolommen, beide met een pipe-gebaseerde syntaxis waarmee je bewerkingen aan elkaar kunt koppelen.
library(dplyr)
# Filter rijen waar name "Dan" is
debt %>% filter(name == "Dan")
# Selecteer alleen de kolom payment (blijft een data frame)
debt %>% select(payment)
# Combineer: filter rijen en selecteer kolommen in één pipeline
debt %>%
filter(payment >= 100) %>%
select(name, payment)
In tegenstelling tot subset() werken dplyr-functies betrouwbaar binnen andere functies en verwerken ze gegroepeerde operaties, joins en samenvattingen in dezelfde pipeline. Als je data-analyseworkflows opbouwt in plaats van losse query’s uit te voeren, is dplyr de standaardtool.
Vergelijking van subsetmethoden
Laten we de verschillende subsetmethoden in R vergelijken in een tabel:
| Methode | Syntaxis | Beste voor | Opmerkingen |
|---|---|---|---|
Brackets [] |
df[rows, cols] |
Fijnmazige controle, programmeren | Werkt op alle R-objecten |
$ |
df$col |
Snel één kolom extraheren | Geeft een vector terug, geen data frame |
subset() |
subset(df, cond) |
Interactieve filtering | Niet aanbevolen binnen functies |
dplyr::filter() |
df %>% filter(cond) |
Datapijplijnen, leesbare code | Vereist het dplyr-pakket |
Tot slot
R biedt meerdere manieren om te subsetten: bracketnotatie [] voor volledige controle, subset() voor leesbare, interactieve filtering, en dplyr::filter() voor datapijplijnen. Brackets werken op elk R-object, subset() leest prettig voor ad-hoc verkenning, en dplyr schaalt goed wanneer je meerdere bewerkingen aaneenrijgt.
Wil je dieper in datamanipulatie met R, bekijk dan de cursus Data Manipulation with dplyr of de cursus Introduction to the Tidyverse op DataCamp.
Subsetten in R: veelgestelde vragen
Wat is het verschil tussen subset() en dplyr::filter() in R?
Beide functies filteren rijen op basis van voorwaarden, maar ze gedragen zich anders in programmeercontexten. subset() gebruikt non-standard evaluation, wat het handig maakt voor interactief gebruik maar onbetrouwbaar binnen door de gebruiker gedefinieerde functies. dplyr::filter() is ontworpen om veilig binnen functies te werken en integreert met de pipe-operator (%>%) om meerdere datamanipulatiestappen aan elkaar te schakelen.
Hoe subset ik meerdere kolommen tegelijk in R?
Je kunt een vector met kolomnamen of indexen tussen de brackets meegeven. Bijvoorbeeld, df[, c("name", "payment")] selecteert twee kolommen op naam, terwijl df[, c(1, 3)] ze op positie selecteert. Met dplyr kun je select(df, name, payment) gebruiken of helperfuncties zoals starts_with() en contains() om kolommen op patroon te matchen.
Waarom geeft het selecteren van één kolom in R een vector terug in plaats van een data frame?
R vereenvoudigt het resultaat standaard wanneer slechts één kolom wordt geselecteerd met bracketnotatie. Dit gedrag wordt bepaald door de parameter drop, die standaard op TRUE staat. Om het resultaat als data frame te behouden, voeg je drop = FALSE toe aan je bracketexpressie, bijvoorbeeld df[, 2, drop = FALSE].
Kan ik rijen subsetten op basis van meerdere voorwaarden in R?
Ja. Je kunt voorwaarden combineren met de operatoren & (EN) en | (OF). Bijvoorbeeld, subset(df, name == "Dan" & payment > 100) geeft rijen terug waar de naam Dan is en de betaling hoger is dan 100. Met dplyr kun je voorwaarden scheiden met komma’s binnen filter(): df %>% filter(name == "Dan", payment > 100).
