In R kun je de functie aggregate() gebruiken om samenvattende inzichten te genereren voor een dataset. De output van deze funtie is een dataframe.

Door een dataset te groeperen (ook wel aggergeren genoemd) kun je gemakkelijk samenvattende inzichten samenstellen.

In dit blog gaan we in op de R aggregate() functie. We behandelen de volgende onderwerpen:

Dit blog is een onderdeel van een blogserie over R waarin we o.a. ingaan op hoe je R installeert, hoe je in RStudio werkt, datasets opent, data manipuleert met bijvoorbeeld dplyr of data.table, of data visualiseert met ggplot2 in bijvoorbeeld een histogram of boxplot.

Introductie in de gebruikte dataset

In deze tutorial werken we met datasets met KNMI metingen. Je kunt de datasets hier downloaden zodat je mee kunt doen met deze tutorial.

Deze dataset bevat metingen van Nederlandse weerstations vanaf 1901. De dataset bevat metingen van de temperatuur en regen per weerstation per tijdseenheid.

Allereerst lezen we de dataset met KNMI meetgegevens uit en doen de nodige bewerkingen:

library(readxl)
library(lubridate)

df_knmi <- read_excel("data/knmi_measurements.xlsx", guess_max = 10000)

# Correct temperature and rainfall measurements
df_knmi$temperature <- df_knmi$temperature / 10
df_knmi$rainfall <- df_knmi$rainfall / 10

# Set date column as date
df_knmi$date <- as.Date(as.character(df_knmi$date), format = "%Y%m%d")

# Add month and year columns
df_knmi$month <- month(df_knmi$date)
df_knmi$year <- year(df_knmi$date)

df_knmi
## # A tibble: 273,954 × 6
##    station_id date       temperature rainfall month  year
##         <dbl> <date>           <dbl>    <dbl> <dbl> <dbl>
##  1        260 1901-01-01        -4.9       NA     1  1901
##  2        260 1901-01-02        -1.8       NA     1  1901
##  3        260 1901-01-03        -2.6       NA     1  1901
##  4        260 1901-01-04        -6.5       NA     1  1901
##  5        260 1901-01-05        -6         NA     1  1901
##  6        260 1901-01-06       -10         NA     1  1901
##  7        260 1901-01-07        -9.2       NA     1  1901
##  8        260 1901-01-08        -4.9       NA     1  1901
##  9        260 1901-01-09         1.1       NA     1  1901
## 10        260 1901-01-10         1.5       NA     1  1901
## # ℹ 273,944 more rows

Met vertrouwen waardevolle inzichten halen uit data met R? Bekijk dan onze opleiding R voor data analyse.

Groeperen op 1 kolom, 1 uitkomst

In onderstaand voorbeeld gaan we van alle metingen de gemiddelde temperatuur per maand berekenen.

Hiervoor gebruiken we de aggregate() functie.

In onderstaande cel doen we het volgende:

  • We maken variabele df_by_month (aggregate) aan.
  • We gebruiken de de aggregate() functie.
  • Met x benoemen we de dataset.
  • Met by = temperature ~ month benoemen we:
  • Groeperen op month.
  • Resultaat bekijken voor temperature.
  • Met FUN benoemen we de functie.
  • Hier mean() voor het gemiddelde.
  • Let op, je benoemt hier alleen de naam van de functie en gebruikt geen ronde haken.
  • Met na.rm = TRUE negeren we missende waarden.
df_by_month <- aggregate(
  x = df_knmi,
  by = temperature ~ month,
  FUN = mean,
  na.rm = TRUE
  )

df_by_month
##    month temperature
## 1      1    2.865666
## 2      2    3.160388
## 3      3    5.655194
## 4      4    8.765553
## 5      5   12.715537
## 6      6   15.535271
## 7      7   17.403408
## 8      8   17.263875
## 9      9   14.547793
## 10    10   10.758074
## 11    11    6.509521
## 12    12    3.806272

We zien nu de gemiddelde temperaturen per maand.


Je kunt gemakkelijk een andere functie kiezen, bijvoorbeeld sd() voor de standaarddeviatie:

df_by_month <- aggregate(
  x = df_knmi,
  by = temperature ~ month,
  FUN = sd,
  na.rm = TRUE
)

df_by_month
##    month temperature
## 1      1    4.248160
## 2      2    4.152564
## 3      3    3.346984
## 4      4    3.365678
## 5      5    3.440935
## 6      6    3.080246
## 7      7    2.893658
## 8      8    2.659784
## 9      9    2.640804
## 10    10    3.218234
## 11    11    3.537038
## 12    12    4.090669

Groeperen op 1 kolom, meerdere uitkomsten

Hierboven hebben we met aggregate() gegroepeerd op maand, en de gemiddelde temperatuur berekend.

Nu groeperen we wederom op maand, maar berekenen naast de gemiddelde temperatuur ook de gemiddelde neerslag.

Hiervoor gebruiken we functie cbind() (combine columns):

df_by_month <- aggregate(
  x = df_knmi,
  by = cbind(temperature, rainfall) ~ month,
  FUN = mean,
  na.rm = TRUE
)

df_by_month
##    month temperature rainfall
## 1      1    3.026073 2.124691
## 2      2    3.369467 1.901205
## 3      3    5.798722 1.722274
## 4      4    8.934488 1.415625
## 5      5   12.838801 1.796455
## 6      6   15.684335 2.182651
## 7      7   17.578303 2.456287
## 8      8   17.409725 2.556852
## 9      9   14.587876 2.326925
## 10    10   10.826652 2.375071
## 11    11    6.655233 2.392043
## 12    12    3.938728 2.405602

We zien nu gemiddelde temperatuur en neerslag per maand in de output terugkomen.


Groeperen op meerdere kolommen

We hebben tot nu toe op één kolom gegroepeerd, de temperatuur.

We voegen hier nu een extra kolom aan toe, het weerstationnummer.

Zo zien we de gemiddelde temperatuur per station per maand.

  • Dit doen we door argument by aan te passen naar by = temperature ~ station_id + month :
df_by_month <- aggregate(
  x = df_knmi,
  by = temperature ~ station_id + month,
  FUN = mean,
  na.rm = TRUE
)

df_by_month
##     station_id month temperature
## 1          240     1    3.065367
## 2          260     1    2.475383
## 3          267     1    3.128327
## 4          269     1    3.321866
## 5          279     1    2.888523
## 6          283     1    2.885060
## 7          286     1    2.611635
## 8          290     1    2.070385
## 9          310     1    3.564377
## 10         340     1    3.689247
## 11         344     1    3.461437
## 12         380     1    2.281169
## 13         240     2    3.184759
## 14         260     2    2.825305
## 15         267     2    3.248894
## 16         269     2    3.670575
## 17         279     2    3.278890
## 18         283     2    3.413976
## 19         286     2    3.005844
## 20         290     2    2.409636
## 21         310     2    3.565853
## 22         340     2    4.333945
## 23         344     2    3.700858
## 24         380     2    2.752073
## 25         240     3    5.673790
## 26         260     3    5.380354
## 27         267     3    5.716835
## 28         269     3    6.114956
## 29         279     3    5.749951
## 30         283     3    5.991496
## 31         286     3    5.372434
## 32         290     3    5.153321
## 33         310     3    5.713515
## 34         340     3    6.524612
## 35         344     3    6.031476
## 36         380     3    5.579542
## 37         240     4    8.701713
## 38         260     4    8.516940
## 39         267     4    9.054896
## 40         269     4    9.396356
## 41         279     4    9.086667
## 42         283     4    9.261414
## 43         286     4    8.692020
## 44         290     4    8.543049
## 45         310     4    8.570833
## 46         340     4    9.728695
## 47         344     4    8.818788
## 48         380     4    8.674701
## 49         240     5   12.624373
## 50         260     5   12.544976
## 51         267     5   12.765625
## 52         269     5   13.153959
## 53         279     5   12.909519
## 54         283     5   13.244564
## 55         286     5   12.354057
## 56         290     5   12.625493
## 57         310     5   12.437865
## 58         340     5   13.365398
## 59         344     5   12.686112
## 60         380     5   12.902702
## 61         240     6   15.443380
## 62         260     6   15.253967
## 63         267     6   15.663978
## 64         269     6   15.842604
## 65         279     6   15.673229
## 66         283     6   16.221563
## 67         286     6   15.249792
## 68         290     6   15.541690
## 69         310     6   15.256377
## 70         340     6   16.361481
## 71         344     6   15.583128
## 72         380     6   15.670575
## 73         240     7   17.246842
## 74         260     7   17.006212
## 75         267     7   17.899090
## 76         269     7   17.774294
## 77         279     7   17.615323
## 78         283     7   18.084476
## 79         286     7   17.440121
## 80         290     7   17.216447
## 81         310     7   17.302637
## 82         340     7   18.117324
## 83         344     7   17.471365
## 84         380     7   17.428532
## 85         240     8   17.205043
## 86         260     8   16.667609
## 87         267     8   17.984577
## 88         269     8   17.571371
## 89         279     8   17.264516
## 90         283     8   17.612500
## 91         286     8   17.495262
## 92         290     8   16.920627
## 93         310     8   17.567427
## 94         340     8   17.961051
## 95         344     8   17.378809
## 96         380     8   17.157981
## 97         240     9   14.660563
## 98         260     9   14.039807
## 99         267     9   15.038602
## 100        269     9   14.583229
## 101        279     9   14.077917
## 102        283     9   14.261771
## 103        286     9   14.355313
## 104        290     9   13.962488
## 105        310     9   15.439598
## 106        340     9   15.004321
## 107        344     9   14.817026
## 108        380     9   14.338649
## 109        240    10   11.001408
## 110        260    10   10.196828
## 111        267    10   11.161082
## 112        269    10   10.774294
## 113        279    10   10.287663
## 114        283    10   10.497593
## 115        286    10   10.305343
## 116        290    10   10.188460
## 117        310    10   11.771164
## 118        340    10   11.424851
## 119        344    10   11.281672
## 120        380    10   10.301112
## 121        240    11    6.813192
## 122        260    11    5.954160
## 123        267    11    7.062366
## 124        269    11    6.807188
## 125        279    11    6.280328
## 126        283    11    6.358487
## 127        286    11    6.179896
## 128        290    11    5.864131
## 129        310    11    7.487565
## 130        340    11    7.246173
## 131        344    11    7.029091
## 132        380    11    5.829080
## 133        240    12    4.164698
## 134        260    12    3.362810
## 135        267    12    3.958308
## 136        269    12    3.973589
## 137        279    12    3.556818
## 138        283    12    3.612623
## 139        286    12    3.347077
## 140        290    12    3.158417
## 141        310    12    4.740309
## 142        340    12    4.382198
## 143        344    12    4.364216
## 144        380    12    3.233259

We zien de gemiddelde temperatuur per weerstation per maand.

Ook kunnen we hieraan de gemiddelde neerslag toevoegen. Dit werkt op een vergelijkbare manier als we eerder zagen.

  • Hiervoor gebruiken we wederom functie cbind():
df_agg <- aggregate(
  x = df_knmi,
  by = cbind(temperature, rainfall) ~ station_id + month,
  FUN = mean,
  na.rm = TRUE)

df_agg
##     station_id month temperature rainfall
## 1          240     1    3.468921 2.076055
## 2          260     1    2.499338 2.150979
## 3          267     1    3.135380 2.098439
## 4          269     1    3.324766 2.154735
## 5          279     1    2.843799 2.345028
## 6          283     1    2.891075 2.149247
## 7          286     1    2.610160 2.110909
## 8          290     1    2.445632 2.270296
## 9          310     1    3.886999 1.934848
## 10         340     1    4.515323 1.856452
## 11         344     1    3.795063 2.270968
## 12         380     1    2.650489 2.004985
## 13         240     2    3.627297 1.753778
## 14         260     2    2.850318 1.866354
## 15         267     2    3.417580 1.835959
## 16         269     2    3.769178 2.058904
## 17         279     2    3.365446 2.335531
## 18         283     2    3.464319 2.002465
## 19         286     2    3.106349 1.830726
## 20         290     2    2.770428 1.813938
## 21         310     2    4.013251 1.709496
## 22         340     2    5.202128 2.129078
## 23         344     2    3.879046 2.021676
## 24         380     2    3.234227 1.980472
## 25         240     3    6.040633 1.707506
## 26         260     3    5.390846 1.698814
## 27         267     3    5.669719 1.455151
## 28         269     3    5.985120 1.710822
## 29         279     3    5.604516 1.875484
## 30         283     3    5.868991 1.715401
## 31         286     3    5.309173 1.576210
## 32         290     3    5.545553 1.931873
## 33         310     3    6.106745 1.543793
## 34         340     3    6.791613 1.734839
## 35         344     3    6.335221 1.900000
## 36         380     3    5.998925 1.804301
## 37         240     4    8.959359 1.303654
## 38         260     4    8.531638 1.578764
## 39         267     4    9.079247 1.240645
## 40         269     4    9.453011 1.444516
## 41         279     4    9.190000 1.469667
## 42         283     4    9.350645 1.345699
## 43         286     4    8.731042 1.232292
## 44         290     4    8.809722 1.446528
## 45         310     4    8.888788 1.313283
## 46         340     4   10.067333 1.258667
## 47         344     4    9.040068 1.351020
## 48         380     4    9.070657 1.522626
## 49         240     5   12.868486 1.689826
## 50         260     5   12.590874 1.828067
## 51         267     5   12.852401 1.691858
## 52         269     5   13.245786 1.891571
## 53         279     5   12.937957 2.045699
## 54         283     5   13.343170 1.764129
## 55         286     5   12.451616 1.813535
## 56         290     5   12.872513 1.832863
## 57         310     5   12.605865 1.564321
## 58         340     5   13.279355 1.699355
## 59         344     5   12.859315 1.788216
## 60         380     5   13.123069 1.941447
## 61         240     6   15.566340 2.168431
## 62         260     6   15.272069 2.182213
## 63         267     6   15.733817 1.945424
## 64         269     6   15.993222 2.227222
## 65         279     6   15.774943 2.343333
## 66         283     6   16.370932 2.117284
## 67         286     6   15.351728 1.981425
## 68         290     6   15.665347 2.238542
## 69         310     6   15.555385 2.014564
## 70         340     6   17.628333 2.101667
## 71         344     6   15.688403 2.279375
## 72         380     6   16.171487 2.397128
## 73         240     7   17.584377 2.402657
## 74         260     7   17.019772 2.528448
## 75         267     7   17.893656 2.089677
## 76         269     7   17.809355 2.919785
## 77         279     7   17.639198 2.960579
## 78         283     7   18.123656 2.600108
## 79         286     7   17.421540 2.645473
## 80         290     7   17.537702 2.323589
## 81         310     7   17.628635 2.220744
## 82         340     7   18.608065 1.720161
## 83         344     7   17.736694 2.393078
## 84         380     7   17.913350 2.369032
## 85         240     8   17.509994 2.607274
## 86         260     8   16.721190 2.642047
## 87         267     8   17.949785 2.956882
## 88         269     8   17.549315 2.883878
## 89         279     8   17.254505 2.545050
## 90         283     8   17.601942 2.687810
## 91         286     8   17.506042 2.328646
## 92         290     8   17.204435 2.237298
## 93         310     8   17.901822 2.388872
## 94         340     8   18.631452 2.071774
## 95         344     8   17.633602 2.626882
## 96         380     8   17.594839 2.463772
## 97         240     9   14.758105 2.624314
## 98         260     9   14.074943 2.333218
## 99         267     9   15.041475 2.467857
## 100        269     9   14.640151 2.371798
## 101        279     9   14.133986 2.367166
## 102        283     9   14.312556 2.198444
## 103        286     9   14.357204 2.412473
## 104        290     9   14.017014 2.079514
## 105        310     9   15.704154 2.261692
## 106        340     9   15.335000 1.685000
## 107        344     9   14.906250 2.772014
## 108        380     9   14.606205 1.957590
## 109        240    10   11.065085 2.718343
## 110        260    10   10.246858 2.397358
## 111        267    10   11.163515 2.577642
## 112        269    10   10.746604 2.442947
## 113        279    10   10.394549 2.384650
## 114        283    10   10.488482 2.126265
## 115        286    10   10.346514 2.097086
## 116        290    10   10.250605 2.075739
## 117        310    10   12.192308 2.452308
## 118        340    10   11.826613 2.679032
## 119        344    10   11.305444 2.839718
## 120        380    10   10.784318 1.968337
## 121        240    11    7.085098 2.818301
## 122        260    11    6.005374 2.489540
## 123        267    11    7.069335 2.186809
## 124        269    11    6.841183 2.277204
## 125        279    11    6.358065 2.135023
## 126        283    11    6.464556 2.084333
## 127        286    11    6.225806 2.059247
## 128        290    11    6.088125 2.188403
## 129        310    11    7.904205 2.543179
## 130        340    11    7.316667 1.691667
## 131        344    11    7.316181 2.807847
## 132        380    11    6.266769 2.182154
## 133        240    12    4.534535 2.426376
## 134        260    12    3.411846 2.456730
## 135        267    12    3.960981 2.233049
## 136        269    12    3.975026 2.349011
## 137        279    12    3.557620 2.592547
## 138        283    12    3.614731 2.426559
## 139        286    12    3.363684 2.234755
## 140        290    12    3.488620 2.396970
## 141        310    12    4.998610 2.352754
## 142        340    12    5.942742 2.219355
## 143        344    12    4.731452 2.608871
## 144        380    12    3.540794 2.314342

Om te onthouden over groeperen met R aggregate()

  • Groeperen op 1 kolom, 1 uitkomst
    • Gebruik functie aggregate() met argumenten:
    • x: de dataset
    • by: de groepering, voorbeeld: by = temperature ~ month
    • FUN: de functie, bijvoorbeeld mean
    • Voeg na.rm = TRUE toe als je missende waarden wilt negeren
  • Groeperen op 1 kolom, meerdere uitkomsten
    • Gebruik de cbind() functie
    • Voorbeeld: by = cbind(temperature, rainfall) ~ month
  • Groeperen op meerdere kolommen
    • Gebruik het plusteken + om meerdere kolommen te benoemen
    • Voorbeeld: by = temperature ~ station_id + month

Expert worden in R?

Wil jij goed leren werken in R? Tijdens onze Opleiding R leer je alles wat je nodig hebt om zelfstandig analyses uit te voeren in R.

by: