Dplyr rowwise(): Radvis beregning

Funksjonen mutate() utfører operasjoner på kolonner. Kommandoen mutate(mean_bmi=mean(bmi)) fører for eksempel til at kolonnen mean_bmi beregnes som gjennomsnittet av kolonnen bmi. Men hvordan gjør vi det hvis mean_bmi i stedet skal beregnes som gjennomsnittet av flere kolonner? Til dette trenger vi funksjonen rowwise().

I disse eksemplene bruker vi mpg-dataene som finnes i pakken tidyverse. Aktiver tidyverse og mpg slik:

library(tidyverse)
data(mpg)

## Inspiser de første 10 radene
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 demonstrasjonen skal bli tydeligere, beholder vi bare de numeriske kolonnene i mpg-dataene. Det nye objektet kalles mpg2:

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

## Inspiserer dataene igjen
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 lager nå to nye variabler: ny_variabel og ny_variabel_2. Disse variablene skal være gjennomsnittet av kolonnene cyl, displ og cty. Variabelen ny_variabel lages uten rowwise(). Variabelen ny_variabel_2 lages med rowwise(), det vil si at den innledes med rowwise(). Vi lager variablene samtidig slik at resultatene 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 rader samme verdi for ny_variabel (8,74). Dette skyldes at mutate() beregnet et kolonnevis (column wise) gjennomsnitt. Verdiene for ny_variabel_2 varierer derimot fra rad til rad, fordi verdiene er beregnet som et radvis (row wise) gjennomsnitt.