library(tidyverse)Funcions bàsiques R (II)
Escenaris i usos del Big Data (UAB)
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.
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.