Cursus
- Subsetten van rijen en kolommen op index
- Subsetten van rijen en kolommen op naam
- Subsetten van rijen en kolommen op waarde
- Oefeningen
Of je nu vergelijkt hoe verschillende demografieën reageren op marketingcampagnes, inzoomt op een specifieke periode, of informatie ophaalt over een paar geselecteerde producten uit de voorraad: met subsetten haal je gerichte observaties uit je dataset. R is een geweldig hulpmiddel dat subsetten eenvoudig en intuïtief maakt. Aan het einde van deze tutorial weet je precies hoe je de informatie haalt die je uit je dataset wilt hebben.
Subsetten verandert de inhoud van je data niet, maar selecteert simpelweg het deel dat het meest relevant is voor je doel. In het algemeen zijn er drie manieren om de rijen en kolommen van je dataset te subsetten—op index, op naam en op waarde.
Subsetten van rijen en kolommen op index
Een manier om je rijen en kolommen te subsetten is via de indexen van je dataset. Dit komt overeen met het beschrijven van je rijen en kolommen als "de eerste rij", "alle rijen in de tweede en vijfde kolom" of "de eerste rij in de tweede tot en met de vijfde kolom". Laten we zulke formuleringen specificeren met een dataset genaamd iris in R. Uit de documentatie: "[D]eze beroemde (Fisher's of Anderson's) iris-dataset geeft de metingen in centimeters van de variabelen kelkbladlengte en -breedte en kroonbladlengte en -breedte voor 50 bloemen van elk van 3 soorten iris. De soorten zijn Iris setosa, versicolor en virginica."
# "De eerste rij":
iris[1, ]
# "Alle rijen in de tweede en vijfde kolom":
iris[, c(2, 5)]
# "De eerste rij in de tweede tot en met de vijfde kolom":
iris[1, 2:5]
Om je data te subsetten, gebruik je rechte haken achter je dataobject. De rijen van je dataset geef je op als het eerste element binnen de haken, en de kolommen als het tweede, gescheiden door een komma:
data[rows, columns]
Subsetten van rijen en kolommen op naam
In R hebben de rijen en kolommen van je dataset naam-attributen. Rijnamen worden zelden gebruikt en geven standaard indexen—gehele getallen van 1 tot het aantal rijen in je dataset—net zoals je in de vorige sectie zag. Als je bijvoorbeeld rownames() aanroept op de iris-dataset, zie je dat deze gewoon van 1 tot 150 zijn geïndexeerd:
> rownames(iris)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
[15] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28"
[29] "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42"
[43] "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56"
[57] "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70"
[71] "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
[85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96" "97" "98"
[99] "99" "100" "101" "102" "103" "104" "105" "106" "107" "108" "109" "110" "111" "112"
[113] "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126"
[127] "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140"
[141] "141" "142" "143" "144" "145" "146" "147" "148" "149" "150"
> nrow(iris)
[1] 150
Rijnamen komen vaker voor in kleinere datasets en worden gebruikt om observaties in je dataset makkelijk herkenbaar te maken. Voor een kleine dataset met gezondheidsinformatie van patiënten van een arts zouden de rijnamen bijvoorbeeld de volledige namen van de patiënten kunnen zijn.
Kolomnamen daarentegen komen vrijwel in elke dataset voor. Je kunt deze benaderen met de functie colnames() of de functie names():
colnames(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
Om je dataset te subsetten op de namen van je rijen en kolommen, gebruik je opnieuw de rechte haken, voorafgegaan door je dataobject:
# Kelkbladbreedte van de vijfde observatie
iris["5", "Sepal.Width"]
# Kelkbladbreedte en kroonbladbreedte
iris[, c("Sepal.Width", "Petal.Width")]
Belangrijk om te onthouden: zowel de rij- als kolomnamen zijn characters, dus het gebruik van enkele of dubbele aanhalingstekens is absoluut noodzakelijk!
Subsetten van rijen en kolommen op waarde
Subsetten op waarde biedt vaak de meeste flexibiliteit. Zo kun je bijvoorbeeld de data over Iris setosa ophalen met een voorwaardelijke expressie zoals deze:
> iris[iris$Species == "setosa", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
...
47 5.1 3.8 1.6 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
49 5.3 3.7 1.5 0.2 setosa
50 5.0 3.3 1.4 0.2 setosa
Voorwaardelijke expressies zoals iris$Species == "setosa" horen in het rij-element tussen de rechte haken (dus het eerste element vóór de komma). Naast de voorwaarde in het eerste element kun je in het tweede element kolommen op index of naam specificeren. Probeer hieronder in de console alleen de kelkbladmetingen van Iris setosa te selecteren:
# Print kelkbladmetingen voor setosa
# Print kelkbladmetingen voor setosa (op naam)
iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]
# Print kelkbladmetingen voor setosa (op index)
iris[iris$Species == "setosa", 1:2]
test_or(
test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]',
incorrect_msg = "Selecteer alleen de kolommen Sepal.Length en Sepal.Width voor de setosa-iris, op naam of op index."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Selecteer alleen de kolommen Sepal.Length en Sepal.Width voor de setosa-iris, op naam of op index.")) success_msg("Mooi werk!") Samenvatting
In deze tutorial heb je:
- Geleerd hoe je je data frame subset op index. Rijen en kolommen zijn geïndexeerd als gehele getallen van 1 tot respectievelijk het aantal rijen en kolommen.
- Geleerd hoe je je data frame subset op naam. Je leerde dat rijnamen zelden gespecificeerd zijn en dat kolomnamen van het type character zijn.
- Geleerd om voorwaardelijke expressies te gebruiken in het rij-element binnen rechte haken om je data frame op waarde te subsetten.
- Geleerd om deze methoden te combineren voor flexibelere subsets (bijv. voorwaarden voor rijen en subsetten op index of naam voor kolommen).
Hieronder vind je enkele oefeningen om te oefenen met wat je hebt geleerd. Oefening baart kunst, dus ga ermee aan de slag!
Oefeningen
Selecteer alle observaties waarvoor de kelkbladbreedte groter is dan de kroonbladlengte.
# Welke observaties hebben een grotere kelkbladbreedte dan kroonbladlengte?
# Welke observaties hebben een grotere kelkbladbreedte dan kroonbladlengte?
iris[iris$Sepal.Width > iris$Petal.Length, ]
test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]',
incorrect_msg = paste("Selecteer de observaties waarvoor de waarden van Sepal.Width", "groter zijn dan de waarden van Petal.Length.")) success_msg("Netjes! Blijkt dat alleen Iris setosa deze vorm heeft.")
iris$Sepal.Width > iris$Petal.Length binnen de rechte haken. Vergeet de komma niet!Selecteer alle Iris versicolor waarvan de kelkbladbreedte groter is dan de gemiddelde kelkbladbreedte over alle soorten.
# Sla de versicolor-data op als een object genaamd versicolor
# Selecteer alle Iris versicolor met een grotere dan gemiddelde kelkbladbreedte
# Sla de versicolor-data op als een object genaamd versicolor
versicolor <- iris[iris$Species == "versicolor", ]
# Selecteer alle Iris versicolor met een grotere dan gemiddelde kelkbladbreedte
versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]
test_object('versicolor',
undefined_msg = "Heb je het object versicolor gedefinieerd?", incorrect_msg = paste("Selecteer waar Species gelijk is aan \"versicolor\".", "Vergeet niet de operator == te gebruiken!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("Bijna! Gebruik je de functie mean()", "om de gemiddelde kelkbladbreedte over alle soorten te bepalen", "en niet alleen voor Iris versicolor?")) success_msg("Mooi werk!")
mean() om de gemiddelde kelkbladbreedte in iris te bepalen en gebruik vervolgens een voorwaardelijke expressie voorafgegaan door versicolor om alleen die rijen met bovengemiddelde waarden te selecteren.Rapporteer de gemiddelde kelkbladbreedte voor alle Iris virginica met kroonbladlengtes kleiner dan 5 centimeter.
# Je bent vrij om dit probleem aan te pakken zoals je wilt!
# Sla de virginica-data op als een object genaamd virginica
virginica <- iris[iris$Species == "virginica", ]
# Gemiddelde kelkbladbreedte voor Iris virginica met kroonbladlengtes kleiner dan 5
mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width)
test_output_contains('2.8',
incorrect_msg = "Onjuist! Dit is een lastige!")
success_msg("Uitstekend!")
Petal.Length kleiner is dan 5. Je vindt het gemiddelde met de functie mean().Meer leren over andere manieren om inzichten uit je data te halen? Bekijk deze cursussen op DataCamp!
Bekijk ook onze tutorial Merging Datasets in R.
Of je nu vergelijkt hoe verschillende demografieën reageren op marketingcampagnes, inzoomt op een specifieke periode, of informatie ophaalt over een paar geselecteerde producten uit de voorraad: met subsetten haal je gerichte observaties uit je dataset. R is een geweldig hulpmiddel dat subsetten eenvoudig en intuïtief maakt. Aan het einde van deze tutorial weet je precies hoe je de informatie haalt die je uit je dataset wilt hebben.
Subsetten verandert de inhoud van je data niet, maar selecteert simpelweg het deel dat het meest relevant is voor je doel. In het algemeen zijn er drie manieren om de rijen en kolommen van je dataset te subsetten: op index, op naam en op waarde.
Subsetten van rijen en kolommen op index
Een manier om je rijen en kolommen te subsetten is via de indexen van je dataset. Dit komt overeen met het beschrijven van je rijen en kolommen als "de eerste rij", "alle rijen in de tweede en vijfde kolom" of "de eerste rij in de tweede tot en met de vijfde kolom". Laten we zulke formuleringen specificeren met een dataset genaamd iris in R. Uit de documentatie: "[D]eze beroemde (Fisher's of Anderson's) iris-dataset geeft de metingen in centimeters van de variabelen kelkbladlengte en -breedte en kroonbladlengte en -breedte voor 50 bloemen van elk van 3 soorten iris. De soorten zijn Iris setosa, versicolor en virginica."
# "De eerste rij":
iris[1, ]
# "Alle rijen in de tweede en vijfde kolom":
iris[, c(2, 5)]
# "De eerste rij in de tweede tot en met de vijfde kolom":
iris[1, 2:5]
Om je data te subsetten, gebruik je rechte haken achter je dataobject. De rijen van je dataset geef je op als het eerste element binnen de haken, en de kolommen als het tweede, gescheiden door een komma:
data[rows, columns]
Subsetten van rijen en kolommen op naam
In R hebben de rijen en kolommen van je dataset naam-attributen. Rijnamen worden zelden gebruikt en geven standaard indexen—gehele getallen van 1 tot het aantal rijen in je dataset—net zoals je in de vorige sectie zag. Als je bijvoorbeeld rownames() aanroept op de iris-dataset, zie je dat deze gewoon van 1 tot 150 zijn geïndexeerd:
> rownames(iris)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
[15] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28"
[29] "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42"
[43] "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56"
[57] "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70"
[71] "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
[85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96" "97" "98"
[99] "99" "100" "101" "102" "103" "104" "105" "106" "107" "108" "109" "110" "111" "112"
[113] "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126"
[127] "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140"
[141] "141" "142" "143" "144" "145" "146" "147" "148" "149" "150"
> nrow(iris)
[1] 150
Rijnamen komen vaker voor in kleinere datasets en worden gebruikt om observaties in je dataset makkelijk herkenbaar te maken. Voor een kleine dataset met gezondheidsinformatie van patiënten van een arts zouden de rijnamen bijvoorbeeld de volledige namen van de patiënten kunnen zijn.
Kolomnamen daarentegen komen vrijwel in elke dataset voor. Je kunt deze benaderen met de functie colnames() of de functie names():
colnames(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
Om je dataset te subsetten op de namen van je rijen en kolommen, gebruik je opnieuw de rechte haken, voorafgegaan door je dataobject:
# Kelkbladbreedte van de vijfde observatie
iris["5", "Sepal.Width"]
# Kelkbladbreedte en kroonbladbreedte
iris[, c("Sepal.Width", "Petal.Width")]
Belangrijk om te onthouden: zowel de rij- als kolomnamen zijn characters, dus het gebruik van enkele of dubbele aanhalingstekens is absoluut noodzakelijk!
Subsetten van rijen en kolommen op waarde
Subsetten op waarde biedt vaak de meeste flexibiliteit. Zo kun je bijvoorbeeld de data over Iris setosa ophalen met een voorwaardelijke expressie zoals deze:
> iris[iris$Species == "setosa", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
...
47 5.1 3.8 1.6 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
49 5.3 3.7 1.5 0.2 setosa
50 5.0 3.3 1.4 0.2 setosa
Voorwaardelijke expressies zoals iris$Species == "setosa" horen in het rij-element tussen de rechte haken (dus het eerste element vóór de komma). Naast de voorwaarde in het eerste element kun je in het tweede element kolommen op index of naam specificeren. Probeer hieronder in de console alleen de kelkbladmetingen van Iris setosa te selecteren:
# Print kelkbladmetingen voor setosa
# Print kelkbladmetingen voor setosa (op naam)
iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]
# Print kelkbladmetingen voor setosa (op index)
iris[iris$Species == "setosa", 1:2]
test_or(
test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]',
incorrect_msg = "Selecteer alleen de kolommen Sepal.Length en Sepal.Width voor de setosa-iris, op naam of op index."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Selecteer alleen de kolommen Sepal.Length en Sepal.Width voor de setosa-iris, op naam of op index.")) success_msg("Mooi werk!") Samenvatting
In deze tutorial heb je:
- Geleerd hoe je je data frame subset op index. Rijen en kolommen zijn geïndexeerd als gehele getallen van 1 tot respectievelijk het aantal rijen en kolommen.
- Geleerd hoe je je data frame subset op naam. Je leerde dat rijnamen zelden gespecificeerd zijn en dat kolomnamen van het type character zijn.
- Geleerd om voorwaardelijke expressies te gebruiken in het rij-element binnen rechte haken om je data frame op waarde te subsetten.
- Geleerd om deze methoden te combineren voor flexibelere subsets (bijv. voorwaarden voor rijen en subsetten op index of naam voor kolommen).
Hieronder vind je enkele oefeningen om te oefenen met wat je hebt geleerd. Oefening baart kunst, dus ga ermee aan de slag!
Oefeningen
Selecteer alle observaties waarvoor de kelkbladbreedte groter is dan de kroonbladlengte.
# Welke observaties hebben een grotere kelkbladbreedte dan kroonbladlengte?
# Welke observaties hebben een grotere kelkbladbreedte dan kroonbladlengte?
iris[iris$Sepal.Width > iris$Petal.Length, ]
test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]',
incorrect_msg = paste("Selecteer de observaties waarvoor de waarden van Sepal.Width", "groter zijn dan de waarden van Petal.Length.")) success_msg("Netjes! Blijkt dat alleen Iris setosa deze vorm heeft.")
iris$Sepal.Width > iris$Petal.Length binnen de rechte haken. Vergeet de komma niet!Selecteer alle Iris versicolor waarvan de kelkbladbreedte groter is dan de gemiddelde kelkbladbreedte over alle soorten.
# Sla de versicolor-data op als een object genaamd versicolor
# Selecteer alle Iris versicolor met een grotere dan gemiddelde kelkbladbreedte
# Sla de versicolor-data op als een object genaamd versicolor
versicolor <- iris[iris$Species == "versicolor", ]
# Selecteer alle Iris versicolor met een grotere dan gemiddelde kelkbladbreedte
versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]
test_object('versicolor',
undefined_msg = "Heb je het object versicolor gedefinieerd?", incorrect_msg = paste("Selecteer waar Species gelijk is aan \"versicolor\".", "Vergeet niet de operator == te gebruiken!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("Bijna! Gebruik je de functie mean()", "om de gemiddelde kelkbladbreedte over alle soorten te bepalen", "en niet alleen voor Iris versicolor?")) success_msg("Mooi werk!")
mean() om de gemiddelde kelkbladbreedte in iris te bepalen en gebruik vervolgens een voorwaardelijke expressie voorafgegaan door versicolor om alleen die rijen met bovengemiddelde waarden te selecteren.Rapporteer de gemiddelde kelkbladbreedte voor alle Iris virginica met kroonbladlengtes kleiner dan 5 centimeter.
# Je bent vrij om dit probleem aan te pakken zoals je wilt!
# Sla de virginica-data op als een object genaamd virginica
virginica <- iris[iris$Species == "virginica", ]
# Gemiddelde kelkbladbreedte voor Iris virginica met kroonbladlengtes kleiner dan 5
mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width)
test_output_contains('2.8',
incorrect_msg = "Onjuist! Dit is een lastige!")
success_msg("Uitstekend!")
Petal.Length kleiner is dan 5. Je vindt het gemiddelde met de functie mean().Meer leren over andere manieren om inzichten uit je data te halen? Bekijk deze cursussen op DataCamp!
Bekijk ook onze tutorial Merging Datasets in R.
