Funcions bàsiques R (II)

Escenaris i usos del Big Data (UAB)

Author

Mireia Camacho

Aquest document engloba tant el codi com les explicacions de classe per a poder fer un bon seguiment de les funcions d’R així com possibles usos per a poder explorar i analitzar conjunts de dades.

library(tidyverse)

Treballarem amb el dataset MPG i us_rent_income (que ja venen integrats a R) per als exemples.

head(mpg,20)
# A tibble: 20 × 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… f        18    29 p     comp…
 2 audi         a4           1.8  1999     4 manu… f        21    29 p     comp…
 3 audi         a4           2    2008     4 manu… f        20    31 p     comp…
 4 audi         a4           2    2008     4 auto… f        21    30 p     comp…
 5 audi         a4           2.8  1999     6 auto… f        16    26 p     comp…
 6 audi         a4           2.8  1999     6 manu… f        18    26 p     comp…
 7 audi         a4           3.1  2008     6 auto… f        18    27 p     comp…
 8 audi         a4 quattro   1.8  1999     4 manu… 4        18    26 p     comp…
 9 audi         a4 quattro   1.8  1999     4 auto… 4        16    25 p     comp…
10 audi         a4 quattro   2    2008     4 manu… 4        20    28 p     comp…
11 audi         a4 quattro   2    2008     4 auto… 4        19    27 p     comp…
12 audi         a4 quattro   2.8  1999     6 auto… 4        15    25 p     comp…
13 audi         a4 quattro   2.8  1999     6 manu… 4        17    25 p     comp…
14 audi         a4 quattro   3.1  2008     6 auto… 4        17    25 p     comp…
15 audi         a4 quattro   3.1  2008     6 manu… 4        15    25 p     comp…
16 audi         a6 quattro   2.8  1999     6 auto… 4        15    24 p     mids…
17 audi         a6 quattro   3.1  2008     6 auto… 4        17    25 p     mids…
18 audi         a6 quattro   4.2  2008     8 auto… 4        16    23 p     mids…
19 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
20 chevrolet    c1500 sub…   5.3  2008     8 auto… r        11    15 e     suv  

LA FUNCIÓ AGGREGATE()

Permet agregar columnes en funció d’altres, similar a la lògica que s’utilitza amb group_by().

aggregate(displ ~ manufacturer + model + year, data = mpg, mean ) %>% head(10)
   manufacturer              model year    displ
1        toyota        4runner 4wd 1999 3.050000
2          audi                 a4 1999 2.300000
3          audi         a4 quattro 1999 2.300000
4          audi         a6 quattro 1999 2.800000
5        nissan             altima 1999 2.400000
6     chevrolet c1500 suburban 2wd 1999 5.700000
7        toyota              camry 1999 2.600000
8        toyota       camry solara 1999 2.600000
9         dodge        caravan 2wd 1999 3.266667
10        honda              civic 1999 1.600000

LA FUNCIÓ PIVOT_WIDER()

head(us_rent_income,20)
# A tibble: 20 × 5
   GEOID NAME                 variable estimate   moe
   <chr> <chr>                <chr>       <dbl> <dbl>
 1 01    Alabama              income      24476   136
 2 01    Alabama              rent          747     3
 3 02    Alaska               income      32940   508
 4 02    Alaska               rent         1200    13
 5 04    Arizona              income      27517   148
 6 04    Arizona              rent          972     4
 7 05    Arkansas             income      23789   165
 8 05    Arkansas             rent          709     5
 9 06    California           income      29454   109
10 06    California           rent         1358     3
11 08    Colorado             income      32401   109
12 08    Colorado             rent         1125     5
13 09    Connecticut          income      35326   195
14 09    Connecticut          rent         1123     5
15 10    Delaware             income      31560   247
16 10    Delaware             rent         1076    10
17 11    District of Columbia income      43198   681
18 11    District of Columbia rent         1424    17
19 12    Florida              income      25952    70
20 12    Florida              rent         1077     3

Transforma els valors d’una columna (normalment factors) en columnes noves.

wider <- us_rent_income %>% pivot_wider(names_from = variable, values_from = c(estimate, moe))

wider
# A tibble: 52 × 6
   GEOID NAME                 estimate_income estimate_rent moe_income moe_rent
   <chr> <chr>                          <dbl>         <dbl>      <dbl>    <dbl>
 1 01    Alabama                        24476           747        136        3
 2 02    Alaska                         32940          1200        508       13
 3 04    Arizona                        27517           972        148        4
 4 05    Arkansas                       23789           709        165        5
 5 06    California                     29454          1358        109        3
 6 08    Colorado                       32401          1125        109        5
 7 09    Connecticut                    35326          1123        195        5
 8 10    Delaware                       31560          1076        247       10
 9 11    District of Columbia           43198          1424        681       17
10 12    Florida                        25952          1077         70        3
# ℹ 42 more rows

LA FUNCIÓ PIVOT_LONGER()

Transforma els noms d’una o diverses columnes en el contingut d’una variable i afegeix els seus valors en una nova columna.

wider %>% pivot_longer(cols = starts_with("estimate"),
                       names_to = "Estimate",
                       values_to = "Estimate_values")
# A tibble: 104 × 6
   GEOID NAME       moe_income moe_rent Estimate        Estimate_values
   <chr> <chr>           <dbl>    <dbl> <chr>                     <dbl>
 1 01    Alabama           136        3 estimate_income           24476
 2 01    Alabama           136        3 estimate_rent               747
 3 02    Alaska            508       13 estimate_income           32940
 4 02    Alaska            508       13 estimate_rent              1200
 5 04    Arizona           148        4 estimate_income           27517
 6 04    Arizona           148        4 estimate_rent               972
 7 05    Arkansas          165        5 estimate_income           23789
 8 05    Arkansas          165        5 estimate_rent               709
 9 06    California        109        3 estimate_income           29454
10 06    California        109        3 estimate_rent              1358
# ℹ 94 more rows

LA FUNCIÓ MERGE()

És la funció que porta integrada R Base per a unir bases de dades.

Hem dividit la base de dades mpg en dues parts per poder fer l’exemple:

Primer dataset:

# A tibble: 10 × 4
   manufacturer model      displ  year
   <chr>        <chr>      <dbl> <int>
 1 audi         a4           1.8  1999
 2 audi         a4           1.8  1999
 3 audi         a4           2    2008
 4 audi         a4           2    2008
 5 audi         a4           2.8  1999
 6 audi         a4           2.8  1999
 7 audi         a4           3.1  2008
 8 audi         a4 quattro   1.8  1999
 9 audi         a4 quattro   1.8  1999
10 audi         a4 quattro   2    2008

Segon dataset:

# A tibble: 10 × 5
    year   cyl class   manufacturer model     
   <int> <int> <chr>   <chr>        <chr>     
 1  1999     4 compact audi         a4        
 2  1999     4 compact audi         a4        
 3  2008     4 compact audi         a4        
 4  2008     4 compact audi         a4        
 5  1999     6 compact audi         a4        
 6  1999     6 compact audi         a4        
 7  2008     6 compact audi         a4        
 8  1999     4 compact audi         a4 quattro
 9  1999     4 compact audi         a4 quattro
10  2008     4 compact audi         a4 quattro

Volem unir-les per la columa YEAR.

merge(mpg1, mpg2, by = "year")  %>% head(20)
   year manufacturer.x model.x displ cyl      class manufacturer.y
1  1999           audi      a4   1.8   4    compact           audi
2  1999           audi      a4   1.8   4    compact           audi
3  1999           audi      a4   1.8   8        suv           ford
4  1999           audi      a4   1.8   6     pickup           ford
5  1999           audi      a4   1.8   6    compact           audi
6  1999           audi      a4   1.8   6    compact           audi
7  1999           audi      a4   1.8   8     pickup           ford
8  1999           audi      a4   1.8   4    compact           audi
9  1999           audi      a4   1.8   4    compact           audi
10 1999           audi      a4   1.8   4 subcompact          honda
11 1999           audi      a4   1.8   6     pickup          dodge
12 1999           audi      a4   1.8   6    compact           audi
13 1999           audi      a4   1.8   6    compact           audi
14 1999           audi      a4   1.8   8        suv     land rover
15 1999           audi      a4   1.8   8 subcompact           ford
16 1999           audi      a4   1.8   6    midsize           audi
17 1999           audi      a4   1.8   8     pickup          dodge
18 1999           audi      a4   1.8   6        suv          dodge
19 1999           audi      a4   1.8   8        suv      chevrolet
20 1999           audi      a4   1.8   4 subcompact          honda
             model.y
1                 a4
2                 a4
3       explorer 4wd
4    f150 pickup 4wd
5                 a4
6                 a4
7    f150 pickup 4wd
8         a4 quattro
9         a4 quattro
10             civic
11 dakota pickup 4wd
12        a4 quattro
13        a4 quattro
14       range rover
15           mustang
16        a6 quattro
17 dakota pickup 4wd
18       durango 4wd
19   k1500 tahoe 4wd
20             civic

Si volem afegir més d’una variable com a punt d’unió, podem posar la funció c() a l’argument ‘by=’.

merge(mpg1, mpg2, by = c("year", "manufacturer", "model")) %>% head(20)
   year manufacturer      model displ cyl   class
1  1999         audi         a4   1.8   4 compact
2  1999         audi         a4   1.8   4 compact
3  1999         audi         a4   1.8   6 compact
4  1999         audi         a4   1.8   6 compact
5  1999         audi         a4   1.8   4 compact
6  1999         audi         a4   1.8   4 compact
7  1999         audi         a4   1.8   6 compact
8  1999         audi         a4   1.8   6 compact
9  1999         audi         a4   2.8   4 compact
10 1999         audi         a4   2.8   4 compact
11 1999         audi         a4   2.8   6 compact
12 1999         audi         a4   2.8   6 compact
13 1999         audi         a4   2.8   4 compact
14 1999         audi         a4   2.8   4 compact
15 1999         audi         a4   2.8   6 compact
16 1999         audi         a4   2.8   6 compact
17 1999         audi a4 quattro   1.8   4 compact
18 1999         audi a4 quattro   1.8   4 compact
19 1999         audi a4 quattro   1.8   6 compact
20 1999         audi a4 quattro   1.8   6 compact

(Noteu que les unions fetes en aquests exemples no són del tot correctes perquè es produeixen duplicitats donat que no hi ha característiques úniques en cada fila del dataset. Per fer correctament unions és necessari un codi identificador o característiques úniques en les dades de la fila.)

LES FUNCIONS JOIN

A Tidyverse existeixen funcions que uneixen datasets segons les necessitats de l’usuari. És similar, però més complet que merge(). Trobem les funcions:

  • ´inner_join()´: El dataset final només mostra les files que estan en els dos datasets. Les files que només estan en un dels dos datasets no apareixen (compte quan vulgueu sobreescriure el nom d’un objecte guardat a R!)

  • ´left_join()´: Les columnes del dataset que es vol afegir al dataset principal quedaran a l’esquerra.

  • ´right_join()´: Les columnes del dataset que es vol afegir al dataset principal quedaran a la dreta.

  • ´full_join()´: Conserva les files dels dos datasets tot i que no hi hagi punts comuns i les omple amb NA.