Dplyr distinct(): Identifiser unike observasjoner og rader

Funksjonen distinct() brukes til å identifisere unike rader (observasjoner) i en dataframe. Dette behovet oppstår ofte, og funksjonen distinct() i kombinasjon med andre dplyr-funksjoner, særlig group_by(), klarer i prinsippet alle oppgaver av denne typen.

I dette kapitlet skal vi bruke mpg-data fra pakken tidyverse. For å få tilgang til dataene må både tidyverse og mpg-dataene aktiveres med følgende kommandoer:

library(tidyverse)
data(mpg)

## Inspiser de første 10 radene
head(mpg, 10)
## A tibble: 10 × 11
   manufacturer model      displ  year   cyl trans      drv     cty   hwy fl    class
   <chr>        <chr>      <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>
 1 audi         a4           1.8  1999     4 auto(l5)   f        18    29 p     compact
 2 audi         a4           1.8  1999     4 manual(m5) f        21    29 p     compact
 3 audi         a4           2    2008     4 manual(m6) f        20    31 p     compact
 4 audi         a4           2    2008     4 auto(av)   f        21    30 p     compact
 5 audi         a4           2.8  1999     6 auto(l5)   f        16    26 p     compact
 6 audi         a4           2.8  1999     6 manual(m5) f        18    26 p     compact
 7 audi         a4           3.1  2008     6 auto(av)   f        18    27 p     compact
 8 audi         a4 quattro   1.8  1999     4 manual(m5) 4        18    26 p     compact
 9 audi         a4 quattro   1.8  1999     4 auto(l5)   4        16    25 p     compact
10 audi         a4 quattro   2    2008     4 manual(m6) 4        20    28 p     compact

Vi begynner med å velge alle rader med unike verdier på variabelen manufacturer.

mpg |>
  distinct(manufacturer, .keep_all = TRUE)
## A tibble: 15 × 11
   manufacturer model              displ  year   cyl trans      drv     cty   hwy fl    class
   <chr>        <chr>              <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>
 1 audi         a4                   1.8  1999     4 auto(l5)   f        18    29 p     compact
 2 chevrolet    c1500 suburban 2wd   5.3  2008     8 auto(l4)   r        14    20 r     suv
 3 dodge        caravan 2wd          2.4  1999     4 auto(l3)   f        18    24 r     minivan
 4 ford         expedition 2wd       4.6  1999     8 auto(l4)   r        11    17 r     suv
 5 honda        civic                1.6  1999     4 manual(m5) f        28    33 r     subcompact
 6 hyundai      sonata               2.4  1999     4 auto(l4)   f        18    26 r     midsize
 7 jeep         grand cherokee 4wd   3    2008     6 auto(l5)   4        17    22 d     suv
 8 land rover   range rover          4    1999     8 auto(l4)   4        11    15 p     suv
 9 lincoln      navigator 2wd        5.4  1999     8 auto(l4)   r        11    17 r     suv
10 mercury      mountaineer 4wd      4    1999     6 auto(l5)   4        14    17 r     suv
11 nissan       altima               2.4  1999     4 manual(m5) f        21    29 r     compact
12 pontiac      grand prix           3.1  1999     6 auto(l4)   f        18    26 r     midsize
13 subaru       forester awd         2.5  1999     4 manual(m5) 4        18    25 r     suv
14 toyota       4runner 4wd          2.7  1999     4 manual(m5) 4        15    20 r     suv
15 volkswagen   gti                  2    1999     4 manual(m5) f        21    29 r     compact

Legg merke til argumentet .keep_all = TRUE. Dette argumentet forteller funksjonen at alle kolonnene i mpg-dataene skal beholdes etter at funksjonen distinct() er brukt. Hvis dette argumentet ikke spesifiseres, beholdes alle unike observasjoner, mens de øvrige variablene fjernes (bortsett fra variabelen som er brukt til å identifisere unike rader).

Vi identifiserer nå alle unike rader (observasjoner) i hver bilklasse (class) innenfor hver produsent (manufacturer):

mpg |>
  distinct(manufacturer, class, .keep_all = TRUE)
## A tibble: 32 × 11
   manufacturer model              displ  year   cyl trans      drv     cty   hwy fl    class
   <chr>        <chr>              <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>
 1 audi         a4                   1.8  1999     4 auto(l5)   f        18    29 p     compact
 2 audi         a6 quattro           2.8  1999     6 auto(l5)   4        15    24 p     midsize
 3 chevrolet    c1500 suburban 2wd   5.3  2008     8 auto(l4)   r        14    20 r     suv
 4 chevrolet    corvette             5.7  1999     8 manual(m6) r        16    26 p     2seater
 5 chevrolet    malibu               2.4  1999     4 auto(l4)   f        19    27 r     midsize
 6 dodge        caravan 2wd          2.4  1999     4 auto(l3)   f        18    24 r     minivan
 7 dodge        dakota pickup 4wd    3.7  2008     6 manual(m6) 4        15    19 r     pickup
 8 dodge        durango 4wd          3.9  1999     6 auto(l4)   4        13    17 r     suv
 9 ford         expedition 2wd       4.6  1999     8 auto(l4)   r        11    17 r     suv
10 ford         f150 pickup 4wd      4.2  1999     6 auto(l4)   4        14    17 r     pickup
11 ford         mustang              3.8  1999     6 manual(m5) r        18    26 r     subcompact
12 honda        civic                1.6  1999     4 manual(m5) f        28    33 r     subcompact
13 hyundai      sonata               2.4  1999     4 auto(l4)   f        18    26 r     midsize
14 hyundai      tiburon              2    1999     4 auto(l4)   f        19    26 r     subcompact
15 jeep         grand cherokee 4wd   3    2008     6 auto(l5)   4        17    22 d     suv
16 land rover   range rover          4    1999     8 auto(l4)   4        11    15 p     suv
17 lincoln      navigator 2wd        5.4  1999     8 auto(l4)   r        11    17 r     suv
18 mercury      mountaineer 4wd      4    1999     6 auto(l5)   4        14    17 r     suv
19 nissan       altima               2.4  1999     4 manual(m5) f        21    29 r     compact
20 nissan       altima               2.5  2008     4 auto(av)   f        23    31 r     midsize
21 nissan       pathfinder 4wd       3.3  1999     6 auto(l4)   4        14    17 r     suv
22 pontiac      grand prix           3.1  1999     6 auto(l4)   f        18    26 r     midsize
23 subaru       forester awd         2.5  1999     4 manual(m5) 4        18    25 r     suv
24 subaru       impreza awd          2.2  1999     4 auto(l4)   4        21    26 r     subcompact
25 subaru       impreza awd          2.5  2008     4 auto(s4)   4        20    25 p     compact
26 toyota       4runner 4wd          2.7  1999     4 manual(m5) 4        15    20 r     suv
27 toyota       camry                2.2  1999     4 manual(m5) f        21    29 r     midsize
28 toyota       camry solara         2.2  1999     4 auto(l4)   f        21    27 r     compact
29 toyota       toyota tacoma 4wd    2.7  1999     4 manual(m5) 4        15    20 r     pickup
30 volkswagen   gti                  2    1999     4 manual(m5) f        21    29 r     compact
31 volkswagen   new beetle           1.9  1999     4 manual(m5) f        35    44 d     subcompact
32 volkswagen   passat               1.8  1999     4 manual(m5) f        21    29 p     midsize

Du kan kombinere distinct() med group_by().