Ga naar hoofdinhoud

Tutorial over de R Apply-familie

In deze tutorial leer je over het gebruik van de apply-functies in R, de varianten en enkele verwante functies, toegepast op verschillende datastructuren.
Bijgewerkt 2 okt 2026  · 14 min lezen

Verken met AI

ChatGPTClaudePerplexity

learn r banner

Een opmerking over de R Apply-familie

De R Apply-familie is een set functies in R waarmee je een functie kunt toepassen op elementen van een vector, lijst of matrix. Het wordt echter beschouwd als verouderde functionaliteit en zou je niet meer voor nieuwe code moeten gebruiken. In plaats daarvan wordt aangeraden om het purrr-pakket te gebruiken voor al het loopen in R. Het purrr-pakket biedt een consistente syntaxis voor het werken met functies die meerdere input- en outputwaarden aannemen, waardoor code schrijven en lezen makkelijker wordt. Daarnaast biedt purrr een reeks functies die zijn geoptimaliseerd voor moderne computeromgevingen, waardoor het sneller en efficiënter is dan de Apply-familie. Al met al, hoewel de R Apply-familie voor sommige toepassingen nog kan werken, is het verstandig om voor alle nieuwe R-projecten het purrr-pakket te gebruiken.

De Apply-functies als alternatief voor loops

In deze post laat ik je zien hoe je de R apply()-functie kunt gebruiken, de varianten zoals mapply() en een paar van apply()’s verwanten, toegepast op verschillende datastructuren. Natuurlijk kunnen niet alle varianten aan bod komen, maar waar mogelijk maak je kennis met het gebruik van deze functies in combinatie, aan de hand van een paar iets uitgebreidere voorbeelden.

Ook kan het handig zijn om deze introductiecursus R te bekijken om lijsten, vectoren, arrays en dataframes beter te begrijpen, al hoef je de tutorial niet per se te hebben afgerond om deze post te volgen!

De apply()-familie

De apply()-familie hoort bij het R base-pakket en bestaat uit functies om herhaaldelijk slices van gegevens uit matrices, arrays, lijsten en dataframes te bewerken. Deze functies laten je de data op verschillende manieren doorkruisen en vermijden expliciet gebruik van loop-constructies. Ze werken op een invoerlijst, matrix of array en passen een benoemde functie toe met één of meerdere optionele argumenten.

De aangeroepen functie kan zijn:

  • Een aggregerende functie, zoals bijvoorbeeld het gemiddelde of de som (die een getal of scalaire waarde teruggeven);
  • Andere transformatie- of subsetfuncties; en
  • Andere gevectoriseerde functies, die complexere structuren opleveren zoals lijsten, vectoren, matrices en arrays.

De apply()-functies vormen de basis voor complexere combinaties en helpen om operaties uit te voeren met heel weinig regels code. Concreet bestaat de familie uit de functies apply(), lapply() , sapply(), vapply(), mapply(), rapply() en tapply().

Maar hoe en wanneer gebruik je deze?

Dat hangt af van de structuur van de data waarop je wilt opereren en het formaat van de output die je nodig hebt.

apply() gebruiken in R

Laten we beginnen met de peetvader van de familie, apply(), die werkt op arrays. Voor de eenvoud beperkt de tutorial zich tot 2D-arrays, ook wel matrices genoemd.

De R base-handleiding zegt dat je hem als volgt aanroept: apply(X, MARGIN, FUN, ...)

waarbij:

  • X een array is of een matrix als de dimensie van de array 2 is;
  • MARGIN een variabele is die bepaalt hoe de functie wordt toegepast: wanneer MARGIN=1, wordt over de rijen gewerkt, terwijl bij MARGIN=2 over de kolommen wordt gewerkt. Let op: wanneer je de constructie MARGIN=c(1,2) gebruikt, wordt op zowel rijen als kolommen toegepast; en
  • FUN de functie is die je op de data wilt toepassen. Dit kan elke R-functie zijn, inclusief een door de gebruiker gedefinieerde functie (UDF).

Beginners hebben soms moeite om te visualiseren wat er gebeurt, dus een plaatje en wat code komen goed van pas om dit te doorgronden.

Laten we een 5 x 6-matrix construeren en stel dat je de waarden van elke kolom wilt optellen.

Je kunt zoiets schrijven als:

# Construct a 5 x 6 matrix
my_matrix <- matrix(1:30, nrow = 5, ncol = 6)

# Calculate the sum of each column
col_sums <- apply(my_matrix, 2, sum)

# Print the result
print(col_sums)

De functie matrix() maakt een 5 x 6-matrix met waarden van 1 tot 30. We gebruiken vervolgens de apply()-functie om de functie sum() toe te passen op elke kolom van de matrix (2 geeft aan dat we de functie op kolommen willen toepassen). De resulterende vector met kolomsommen wordt opgeslagen in de variabele col_sums en op de console afgedrukt.

Onthoud dat je in R een matrix kunt zien als een verzameling rijvectoren wanneer je de matrix van boven naar beneden doorkruist (langs de verticale lijn 1, die de dimensie of marge 1 specificeert), of als een lijst van kolomvectoren, van links naar rechts langs dimensie of marge 2.

Dat betekent dat de instructie die je zojuist hebt ingevoerd, weergegeven in figuur 1, neerkomt op: “pas de functie ‘sum’ toe op matrix X langs marge 2 (per kolom), waarbij je de waarden van elke kolom optelt.”

Merk op dat, om het plaatje overzichtelijk te houden, slechts één van de kolommen is gemarkeerd.

Je eindigt met een rijvector met de sommen van de waarden van elke kolom.

De output van de bovenstaande code, een rijvector, zou ook zijn gegeven als je langs de rijen van de matrix had opgeteld. Dit is hoe R het resultaat weergeeft.

Een kanttekening voor het volgende: in de meeste gevallen kan R een waarde teruggeven, zelfs als die niet is gespecificeerd, of preciezer: als de geretourneerde waarde van de functie niet aan een variabele is toegewezen. R retourneert simpelweg het laatst geëvalueerde object. In de praktijk is het echter, wanneer je de retourwaarde wilt controleren en wanneer je verdere bewerkingen op die waarden wilt doen, het beste om de resultaten van een functie expliciet aan een variabele toe te wijzen.

De lapply()-functie

Je wilt een bepaalde functie toepassen op elk element van een lijst en een lijst als resultaat krijgen. Wanneer je ?lapply uitvoert, zie je dat de syntaxis lijkt op die van de apply()-functie.

Het verschil is dat:

  1. Hij ook gebruikt kan worden voor andere objecten zoals dataframes, lijsten of vectoren; en
  2. De output een lijst is (wat de “l” in de functienaam verklaart), met hetzelfde aantal elementen als het doorgegeven object.

Om te zien hoe dit werkt, maak je een paar matrices en haal je uit elke matrix een bepaalde kolom.

Dit is een vrij gebruikelijke bewerking op echte data bij het vergelijken of aggregeren vanuit verschillende dataframes.

Ons speelgoedvoorbeeld, weergegeven in figuur 2, kan als volgt worden gecodeerd:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgbGlzdCBvZiBtYXRyaWNlc1xuTXlMaXN0IDwtIGxpc3QoQSxCLEMpXG5cbiMgRXh0cmFjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGBNeUxpc3RgIHdpdGggdGhlIHNlbGVjdGlvbiBvcGVyYXRvciBgW2Agd2l0aCBgbGFwcGx5KClgXG4uLi4uLi4oTXlMaXN0LFwiW1wiLCAsIDIpXG5cbiMgRXh0cmFjdCB0aGUgMXN0IHJvdyBmcm9tIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCApIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIGxpc3Qgb2YgbWF0cmljZXNcbk15TGlzdCA8LSBsaXN0KEEsQixDKVxuXG4jIEV4dHJhY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBgTXlMaXN0YCB3aXRoIHRoZSBzZWxlY3Rpb24gb3BlcmF0b3IgYFtgIHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgLCAyKVxuXG4jIEV4dHJhY3QgdGhlIDFzdCByb3cgZnJvbSBgTXlMaXN0YFxubGFwcGx5KE15TGlzdCxcIltcIiwgMSwgKSIsInNjdCI6InRlc3Rfb2JqZWN0KFwiTXlMaXN0XCIpXG50ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIsIGluZGV4ID0gMSlcbnRlc3RfZnVuY3Rpb24oXCJsYXBwbHlcIiwgaW5kZXggPSAyKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

lapply vs apply functions

De bewerking staat weergegeven aan de linkerkant van figuur 2.

Opnieuw begin je met het specificeren van het object van interesse, de lijst Mylist. Je gebruikt de standaard R-selectie-operator [ en laat dan de eerste parameter weg (wat dus neerkomt op “alle”, daarom zie je de twee komma’s).

Vervolgens geef je de tweede parameter op, namelijk 2: onze marge is ‘kolom’. Je haalt dus de tweede kolom uit alle matrices in de lijst.

Een paar opmerkingen bij de bovenstaande code:

  • De [-notatie is de select-operator. Onthoud bijvoorbeeld dat je om alle elementen van de derde rij van B te extraheren, nodig hebt: B[3,];
  • De [[ ]]-notatie drukt uit dat we met lijsten werken: [[2]] betekent het tweede element van de lijst. Dit zie je ook in de output die R geeft;
  • De output is een lijst met evenveel elementen als het element in de input; en
  • Merk op dat je ook één enkel element per matrix had kunnen extraheren, zo: lapply(MyList,"[", 1, 2)

Rechts in figuur 2 zie je een alternatieve extractie: dit keer laat je de eerste parameter weg en krijg je de eerste rij uit elk van de matrices.

Probeer het zelf! Selecteer de tweede kolom uit elke matrix in de lijst:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBVc2UgYGxhcHBseSgpYCB0byBzZWxlY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBlYWNoIG1hdHJpeCBpbiBgTXlMaXN0YFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMSwpIiwic29sdXRpb24iOiIjIFVzZSBgbGFwcGx5KClgIHRvIHNlbGVjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGVhY2ggbWF0cml4IGluIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIpXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9

De sapply()-functie

De functie sapply() werkt als lapply(), maar probeert de output te vereenvoudigen tot de meest elementaire datastructuur die mogelijk is. En inderdaad, sapply() is een ‘wrapper’-functie voor lapply().

Een voorbeeld helpt: stel dat je de extractie van één enkel element uit het vorige voorbeeld wilt herhalen, maar nu het eerste element van de tweede rij (indexen 2 en 1) voor elke matrix neemt.

Het toepassen van de functie lapply() zou ons een lijst geven, tenzij je simplify=FALSE als parameter doorgeeft aan sapply(). Dan wordt er een lijst geretourneerd. Zie in het codeblok hieronder hoe dit werkt:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBSZXR1cm4gYSBsaXN0IHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHNhcHBseSgpYFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBzYXBwbHkoKWBcbi4uLi4uLihNeUxpc3QsXCJbXCIsIDIsIDEsIHNpbXBsaWZ5PUYpXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHVubGlzdCgpYFxuLi4uLi4uKGxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKSkiLCJzb2x1dGlvbiI6IiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBsYXBwbHkoKWBcbmxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGBzYXBwbHkoKWBcbnNhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIGxpc3Qgd2l0aCBgc2FwcGx5KClgXG5zYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxLCBzaW1wbGlmeT1GKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGB1bmxpc3QoKWBcbnVubGlzdChsYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxICkpIiwic2N0IjoidGVzdF9mdW5jdGlvbihcImxhcHBseVwiKVxudGVzdF9mdW5jdGlvbihcInNhcHBseVwiLCBpbmRleCA9IDEpXG50ZXN0X2Z1bmN0aW9uKFwic2FwcGx5XCIsIGluZGV4PSAyKVxudGVzdF9mdW5jdGlvbihcInVubGlzdFwiLCBcInhcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Omgekeerd kan een functie als unlist() lappy() vertellen om je een vector te geven!

Hoe dan ook, om verwarring te vermijden, is het het beste om deze functies in hun ‘natuurlijke formaat’ te gebruiken en conversies te vermijden tenzij strikt noodzakelijk.

De rep()-functie

Iets wat vaak samen met apply()-functies wordt gebruikt, is rep(). Wanneer je deze toepast op een vector of factor x, dupliceert de functie de waarden een opgegeven aantal keren.

Laten we een van de vectoren gebruiken die je hierboven met lapply() in MyList hebt gegenereerd.

Dit keer selecteer je echter alleen de elementen van de eerste rij en eerste kolom uit elk element van de lijst MyList (en je gebruikt sapply() om een vector te krijgen):

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGBaYFxuWiA8LSBzYXBwbHkoTXlMaXN0LFwiW1wiLCAxLDEgKVxuXG4jIFJldHVybiBgWmBcblpcblxuIyBSZXBsaWNhdGUgdGhlIHZhbHVlcyBvZiBgWmBcblogPC0gcmVwKFosYygzLDEsMikpXG5cbiMgUmV0dXJuIGBaYFxuWiJ9

Je ziet dat de bovenstaande code de waarden van Z een aantal keren repliceert zoals vastgesteld door c(3,1,2): drie keer de eerste, één keer de tweede en twee keer de derde:

Handig, toch?

De mapply()-functie

De functie mapply() staat voor ‘multivariate’ apply. Het doel is om argumenten te vectoriseren voor een functie die normaal gesproken geen vectoren als argumenten accepteert.

Kort gezegd past mapply() een functie toe op meerdere lijst- of meerdere vectorargumenten.

Laten we een mapply()-voorbeeld bekijken waarin je een 4 x 4-matrix maakt met een herhaalde aanroep van de functie rep():

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDR4NCBtYXRyaXhcblExIDwtIC4uLi4uLihjKHJlcCgxLCA0KSwgcmVwKDIsIDQpLCByZXAoMywgNCksIHJlcCg0LCA0KSksNCw0KVxuXG4jIFByaW50IGBRMWBcbi4uLi4uKFExKVxuXG4jIE9yIHVzZSBgbWFwcGx5KClgXG5RMiA8LSAuLi4uLi4ocmVwLDE6NCw0KVxuXG4jIFByaW50IGBRMmBcbnByaW50KFEyKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgYSA0eDQgbWF0cml4XG5RMSA8LSBtYXRyaXgoYyhyZXAoMSwgNCksIHJlcCgyLCA0KSwgcmVwKDMsIDQpLCByZXAoNCwgNCkpLDQsNClcblxuIyBQcmludCBgUTFgXG5wcmludChRMSlcblxuIyBPciB1c2UgYG1hcHBseSgpYFxuUTIgPC0gbWFwcGx5KHJlcCwxOjQsNClcblxuIyBQcmludCBgUTJgXG5wcmludChRMikiLCJzY3QiOiJ0ZXN0X29iamVjdChcIlExXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWF0cml4KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hdHJpeCgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MSwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgYWRkIGBwcmludCgpYCB0byB0aGUgY29kZT9cIiwgdW5kZWZpbmVkX21zZz1cIkRpZCB5b3UgZm9yZ2V0IHRvIGFkZCBgcHJpbnQoKWAgdG8gdGhlIGNvZGU/XCIpXG50ZXN0X29iamVjdChcIlEyXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWFwcGx5KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hcHBseSgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MikifQ==

Maar je ziet dat er een efficiëntere manier is om de resultaten van de functie rep() te binden dan met c(): wanneer je mapply() aanroept, vectoriseer je de actie van de functie rep().

De aggregate()-functie

Deze functie zit in het stats-pakket, en je gebruikt hem als volgt: aggregate(x, by, FUN, ..., simplify = TRUE).

Met andere woorden, hij werkt vergelijkbaar met de apply()-functie: je specificeert het object, de functie en je geeft aan of je wilt vereenvoudigen, net als bij de functie sapply(). Het cruciale verschil is het gebruik van de by-clausule, die de variabele of het dataframeveld instelt waarop we de aggregatie willen uitvoeren.

In de volgende sectie zie je hoe dit werkt.

Een voorbeeld van aggregate()

Beschouw de speelgoeddataset Mydf, die gegevens bevat over de verkoop van een product en waarin sommige waarden in de kolom DepPC zich herhalen.

Deze variabele classificeert de gegevens op een geografische locatie, zoals het deel van een postcode (hier komen de nummers overeen met de departementen van de Île-de-France, de regio rond Parijs).

Je wilt wat statistiek doen op de verkoopkolommen. Dat zijn DProgr, een oplopend nummer in toenemende tijdsvolgorde, en de verkopen van het product (de hoeveelheid Qty), plus een logische variabele, Delivered, die aangeeft of het product is geleverd (T) of niet (F).

Eerst kun je een aantal heel eenvoudige dingen doen om vertrouwd te raken met de dataset, anders dan alles tonen door simpelweg de naam te typen (hier hebben we slechts 120 records, maar stel je voor dat je dit doet voor een echt bestand met duizenden regels!).

Laten we de data verkennen:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG4uLi4uKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG4uLi4uKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbi4uLihNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzb2x1dGlvbiI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG5oZWFkKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG50YWlsKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbmRpbShNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwiaGVhZFwiKVxudGVzdF9mdW5jdGlvbihcInRhaWxcIilcbnRlc3RfZnVuY3Rpb24oXCJzYXBwbHlcIilcbnRlc3RfZnVuY3Rpb24oXCJkaW1cIilcbnRlc3RfZnVuY3Rpb24oXCJ1bmlxdWVcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Let op dat je, als je het aantal rijen en kolommen van het dataframe wilt zien, ook had kunnen aanroepen nrow(Mydf) en ncol(Mydf).

Veel meer vragen over de data zijn mogelijk.

Hier ben je bijvoorbeeld geïnteresseerd in waar het product het best verkoopt, in welk departement. Daarom moet je de data groeperen per departement, waarbij je de verkopen, Qty, per departement DepPC optelt met behulp van de functie aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6ImFnZ3JlZ2F0ZShNeWRmJFF0eSwgYnk9TXlkZltcIkRlcFBDXCJdLCBGVU49c3VtKSJ9

Dus, aggregate() vertelt R dat je alle Qty wilt optellen die tot hetzelfde departement behoren.

Let op dat R de som aan een variabele ‘x’ heeft toegewezen, omdat je niets anders hebt aangegeven.

De output is vrij leesbaar zoals hij is, maar bij een groter aantal departementen kan dit minder overzichtelijk zijn. In zulke gevallen kun je een grafische weergave gebruiken: je plot de resultaten met een van R’s grafische systemen, samen met de functie aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IHRoZSBzYWxlcyBwZXIgZGVwYXJ0bWVudFxuZ2dwbG90KGRhdGE9YWdncmVnYXRlKE15ZGYkUXR5LGJ5PU15ZGZbXCJEZXBQQ1wiXSxGVU49c3VtKSwgYWVzKHg9RGVwUEMsIHk9eCkpICtcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3RpdGxlKFwiU2FsZXMgcGVyIGRlcGFydG1lbnQgLSBBbGxcIikifQ==

Dit geeft ons de verkoop per departement.

Je kunt jezelf dezelfde vraag stellen, maar dan alleen voor de goederen die geleverd zijn. Om dit te doen subset je eerst de data waarvoor delivered waar (T) is met de inmiddels bekende subset-operator "[".

Let op dat je hier het resultaat toewijst aan een nieuwe variabele Y, een nieuw dataframe dat dezelfde kolomnamen erft van het bovenliggende dataframe Mydf. Dit doe je om te vermijden dat je de aggregate-instructie in de plot-aanroep moet herhalen voor de leesbaarheid:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKVxubGlicmFyeShnZ3Bsb3QyKSIsInNhbXBsZSI6IiMgc2VsZWN0IG9ubHkgZm9yIGRlbGl2ZXJlZD1UcnVlXG5ZIDwtIE15ZGZbTXlkZiREZWxpdmVyZWQ9PVRSVUUsXVxuXG4jIFBsb3QgdGhlIHNhbGVzIGJ5IGRlcGFydG1lbnRcbmdncGxvdChkYXRhPWFnZ3JlZ2F0ZShZJFF0eSxieT1ZW1wiRGVwUENcIl0sRlVOPXN1bSksIGFlcyh4PURlcFBDLCB5PXgpKSArXG4gIGdlb21fcG9pbnQoKStcbiAgZ2d0aXRsZShcIlNhbGVzIHBlciBkZXBhcnRtZW50IC0gRGVsaXZlcmVkXCIpIn0=

Je had dus verschillende vragen aan de data kunnen stellen op een gevectoriseerde manier zoals met aggregate(), en dit doe je vaak in combinatie met een handig plotsysteem zoals ggplot2, zodat je het idee te pakken hebt.

Let op dat je hiervoor maar heel weinig regels code nodig had.

Vectorisatie als alternatief voor loops en Apply-functies?

Je hebt een paar variaties op hetzelfde thema gezien, namelijk “voer herhaaldelijk acties uit op een gestructureerde set data”. In die zin kun je deze functies zien niet alleen als een alternatief voor loops, maar ook als een gevectoriseerde manier van werken.

“Gevectoriseerd” hier in losse zin; we gaan niet in op het debat of – en welke van de – apply()-functies daadwerkelijk gevectoriseerd zijn (zie bijvoorbeeld de discussie hier).

In de praktijk moet je, om te kiezen welke apply()-functie je gebruikt, het volgende overwegen:

  • Het datatype van de input: dit is het object waarop je gaat werken (vector, matrix, array…, lijst, dataframe of misschien een combinatie daarvan)
  • Wat je van plan bent te doen: de FUN-functie die je wilt doorgeven
  • De subsets van die data: rijen, kolommen, of misschien alles?
  • Welk type data wil je van de functie terugkrijgen? Omdat je er mogelijk verdere bewerkingen op wilt uitvoeren (en wil je een nieuw object, of wil je het invoerobject direct transformeren?)

Dit zijn vrij algemene vragen die je ook kunt stellen voor de gerelateerde functies, waarvan we aggregate(), by(), sweep(), enz. hebben bekeken.

Maar er zijn er nog veel meer! Stop nu niet met ontdekken! Bekijk de DataCamp-tutorial Arrays in R.

Als vervolg op deze tutorial kun je de DataCamp-cursussen Introduction to R of Intermediate R overwegen.

Onderwerpen
R
Data Science

Leer meer over R

Cursus

Introductie tot R

4 uur
3.1M
Beheers de basis van data-analyse in R, inclusief vectors, lists en data frames, en oefen met echte datasets.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken