Dplyr rowwise(): Rækkevis beregning

Funktionen mutate() udfører operationer på kolonner. Eksempelvis resulterer kommandoen mutate(mean_bmi=mean(bmi)) i, at kolonnen mean_bmi beregnes som gennemsnittet af kolonnen bmi. Men hvad gør vi, hvis mean_bmi i stedet skal beregnes som gennemsnittet af flere kolonner? Til det har vi brug for funktionen rowwise().

I disse eksempler bruger vi mpg-data, som findes i pakken tidyverse. Aktivér tidyverse og mpg på følgende måde:

library(tidyverse)
data(mpg)

## Inspicér de første 10 rækker
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

For at gøre demonstrationen tydeligere gemmer vi kun de numeriske kolonner i mpg-data. Det nye objekt kaldes mpg2:

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

## Inspicerer data igen
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

Vi opretter nu to nye variabler: ny_variabel og ny_variabel_2. Disse variabler skal være gennemsnittet af kolonnerne cyl, displ og cty. Variablen ny_variabel oprettes uden rowwise(). Variablen ny_variabel_2 oprettes med rowwise(), hvilket betyder, at den forudgås af rowwise(). Vi opretter variablerne samtidig, så resultatet kan sammenlignes direkte. Koden er som følger:

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

Som det fremgår ovenfor, har alle rækker samme værdi for ny_variabel (8,74). Det skyldes, at mutate() beregnede et kolonnevis (column wise) gennemsnit. Værdierne for ny_variabel_2 varierer derimod fra række til række, hvilket skyldes, at værdierne er beregnet som et rækkevis (row wise) gennemsnit.