Dplyr rowwise(): Zeilenweise Berechnung

Die Funktion mutate() führt Operationen auf Spalten aus. So bewirkt beispielsweise der Befehl mutate(mean_bmi=mean(bmi)), dass die Spalte mean_bmi als Mittelwert der Spalte bmi berechnet wird. Wie gehen wir aber vor, wenn mean_bmi stattdessen als Mittelwert mehrerer Spalten berechnet werden soll? Dafür benötigen wir die Funktion rowwise().

In diesen Beispielen verwenden wir die Daten mpg, die im Package tidyverse enthalten sind. Aktivieren Sie tidyverse und mpg wie folgt:

library(tidyverse)
data(mpg)

## Die ersten 10 Zeilen inspizieren
head(mpg, 10)
manufacturer  model      displ  year   cyl trans      drv     cty   hwy fl    class
 audi         a4           1.8  1999     4 auto(l5)   f        18    29 p     compact
 audi         a4           1.8  1999     4 manual(m5) f        21    29 p     compact
 audi         a4           2    2008     4 manual(m6) f        20    31 p     compact
 audi         a4           2    2008     4 auto(av)   f        21    30 p     compact
 audi         a4           2.8  1999     6 auto(l5)   f        16    26 p     compact
 audi         a4           2.8  1999     6 manual(m5) f        18    26 p     compact
 audi         a4           3.1  2008     6 auto(av)   f        18    27 p     compact
 audi         a4 quattro   1.8  1999     4 manual(m5) 4        18    26 p     compact
 audi         a4 quattro   1.8  1999     4 auto(l5)   4        16    25 p     compact
 audi         a4 quattro   2    2008     4 manual(m6) 4        20    28 p     compact

Damit die Demonstration übersichtlicher wird, behalten wir nur die numerischen Spalten der mpg-Daten. Das neue Objekt heißt mpg2:

mpg2 <- mpg %>% select(where(is.numeric))

## Die Daten erneut inspizieren
head(mpg2, 10)
   displ  year   cyl   cty   hwy
    1.8  1999     4    18    29
    1.8  1999     4    21    29
    2    2008     4    20    31
    2    2008     4    21    30
    2.8  1999     6    16    26
    2.8  1999     6    18    26
    3.1  2008     6    18    27
    1.8  1999     4    18    26
    1.8  1999     4    16    25
    2    2008     4    20    28

Wir erstellen nun zwei neue Variablen: ny_variabel und ny_variabel_2. Diese Variablen sollen den Mittelwert der Spalten cyl, displ und cty darstellen. Die Variable ny_variabel wird ohne rowwise() erstellt. Die Variable ny_variabel_2 wird mit rowwise() erstellt, das heißt, ihr geht rowwise() voraus. Wir erstellen beide Variablen gleichzeitig, damit sich die Ergebnisse direkt vergleichen lassen. Der Code lautet wie folgt:

mpg2 |>
  mutate(ny_variabel = mean(c(cyl, displ, cty))) |>
  rowwise() |>
  mutate(ny_variabel_2 = mean(c(cyl, displ, cty)))
  displ  year   cyl   cty   hwy ny_variabel ny_variabel_2
    1.8  1999     4    18    29        8.74          7.93
    1.8  1999     4    21    29        8.74          8.93
    2    2008     4    20    31        8.74          8.67
    2    2008     4    21    30        8.74          9
    2.8  1999     6    16    26        8.74          8.27
    2.8  1999     6    18    26        8.74          8.93
    3.1  2008     6    18    27        8.74          9.03
    1.8  1999     4    18    26        8.74          7.93
    1.8  1999     4    16    25        8.74          7.27
    2    2008     4    20    28        8.74          8.67

Wie oben ersichtlich, haben alle Zeilen denselben Wert für ny_variabel (8,74). Das liegt daran, dass mutate() einen spaltenweisen (column wise) Mittelwert berechnet hat. Die Werte von ny_variabel_2 unterscheiden sich dagegen von Zeile zu Zeile, weil sie als zeilenweiser (row wise) Mittelwert berechnet wurden.