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:
- Introductie in gebruikte dataset
- Aggregate(): Groeperen op 1 kolom, 1 uitkomst
- Aggregate(): Groeperen op 1 kolom, meerdere uitkomsten
- Groeperen op meerdere kolommen met aggregate()
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
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 naarby = 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 datasetby
: de groepering, voorbeeld:by = temperature ~ month
FUN
: de functie, bijvoorbeeldmean
- Voeg
na.rm = TRUE
toe als je missende waarden wilt negeren
- Gebruik functie
- Groeperen op 1 kolom, meerdere uitkomsten
- Gebruik de
cbind()
functie - Voorbeeld:
by = cbind(temperature, rainfall) ~ month
- Gebruik de
- Groeperen op meerdere kolommen
- Gebruik het plusteken
+
om meerdere kolommen te benoemen - Voorbeeld:
by = temperature ~ station_id + month
- Gebruik het plusteken
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.
Peter is een ervaren data scientist en python trainer. Na zijn studie aan de Technische Universiteit Delft heeft hij zich altijd bezig gehouden met data en diverse programmeertalen. Peter heeft veel data analyses uitgevoerd en processen geautomatiseerd met Python in productieomgevingen.