Dplyr rowwise(): Radvis beräkning

Funktionen mutate() utför operationer på kolumner. Exempelvis resulterar kommandot mutate(mean_bmi=mean(bmi)) till att kolumnen mean_bmi beräknas som medelvärdet av kolumnen bmi. Men hur gör vi om mean_bmi istället skall beräknas som medelvärdet av flera kolumner? För detta behöver vi funktionen rowwise().

I dessa exempel använder vi mpg data som finns i paketet tidyverse. Aktivera tidyverse och mpg som följer:

library(tidyverse)
data(mpg)

## Inspektera första 10 raderna
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

För att demonstrationen skall bli tydligare sparar vi endast de numeriska kolumnerna i mpg data. Det nya objektet kallas mpg2:

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

## Inspekterar 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 skapar nu två nya variabler: ny_variabel och ny_variabel_2. Dessa variabler skall vara medelvärdet av kolumnerna cyl, displ och cty. Variabeln ny_variabel skapas utan rowwise(). Variabeln ny_variabel_2 skapas med rowwise(), vilket innebär att den föregås av rowwise(). Vi skapar variablerna samtidigt för att resultatet skall kunna jämföras direkt. Koden är som följer:

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 framgår ovan har alla rader samma värde på ny_variabel (8.74). Detta förklaras av att mutate() beräknade kolumnvis (column wise) medelvärde. Värdena för ny_variabel_2 varierar dock på varje rad, vilket beror på att värdena beräknats som radvis (row wise) medelvärde.