Módulo práctico de ITA
(Grupo M)
Vam aprendre a carregar dades ia fer-les TIDY, però és rar que les dades estiguin preparades per començar la nostra anàlisi, així que cal “arreglar/netejar” les dades
Arreglant les dades
dplyr
és el paquet més important per manipular dades.dplyr
dplyr
és un paquet que permet manipular dades de forma intuïtivaTé 6-7 funcions (o verbs) principals
%>%
)sintaxi de dplyr
Totes les funcions tenen una estructura o comportament similar:
el primer argument sempre és un df
els arguments següents descriuen que fer amb les dades.
el resultat és sempre un nou df
principals funcions de dplyr
select()
: selecciona columnesfilter()
: filtra/selecciona files (que compleixen una o diverses condicions)mutate()
:crea noves columnes (variables)arrange()
: reordena les filesrename()
: canvia els noms de les columnessummarise()
: resumeix (col·lapsa) els valors d’una columna a un sol valor. Per exemple, calcula la mitjana, màxim, mínim, etc….hi ha una setena funció (que dóna molta potència a dplyr
)
group_by()
: “agrupa” files (en funció d’una o diverses condicions)dplyr
amb exemplestreballarem amb dades del pkg gapminder
Suposo que ja sabeu que fa el codi següent?
gapminder
que està al paquet gapminderselect()
s’utilitza per seleccionar variables
De vegades volem reordenar les columnes/variables
relocate()
De vegades volem reanomenar les columnes
rename
()la funció names()
de R-base és útil
De vegades volem CREAR noves columnes
Podem fer-ho amb mutate()
Per exemple, podem crear la variable: GDP = pop * gdpperCap
filter()
: permet seleccionar files
files que compleixen unes determinades condicions o criteris lògics
gapminder <- gapminder::gapminder #- cargamos los datos
#- Observaciones de España (country == "Spain")
aa <- gapminder %>% filter(country == "Spain")
#- filas con valores de "lifeExp" < 29
aa <- gapminder %>% filter(lifeExp < 29)
#- filas con valores de "lifeExp" entre [29, 32]
aa <- gapminder %>% filter(lifeExp >= 29 & lifeExp <= 32)
aa <- gapminder %>% filter(between(lifeExp, 29, 32))
#- observaciones de países de África con lifeExp > 32
aa <- gapminder %>% filter(lifeExp > 72 & continent == "Africa")
#- observaciones de países de África o Asia con lifeExp > 32
aa <- gapminder %>% filter(lifeExp > 72 & continent %in% c("Africa", "Asia") )
aa <- gapminder %>% filter(lifeExp > 72 & (continent == "Africa" | continent == "Asia") )
slice()
és una variant de filter()
permet seleccionar files però per posició
filter()
y slice()
ambdues seleccionen files, la primera per condicions i la segona per posició:variants de slice()
slice_max()
i slice_min()
: seleccionen files amb valor màxim (o mínim) d’una variable:#- selecciona les 3 files amb més valor de lifeExp
aa <- gapminder %>% slice_max(lifeExp, n = 3)
#- selecciona les 4 files amb MENOR valor de pop
aa <- gapminder %>% slice_min(pop, n = 4)
#- observacions en el primer décil quant a esperança de vida, 10% amb menys esperança de vida
aa <- gapminder %>% slice_min(lifeExp, prop = 0.1)
#- 1% d'observacions amb més població. Imagino que estaran la Xina i l'Índia
aa <- gapminder %>% slice_max(pop, prop = 0.01)
variants de slice()
slice_sample()
: permet obtenir una mostra aleatòria de les dadesarrange()
: permet reordenar les files d’un df
#- ordena les files de MENOR a major segons els valors de la v. lifeExp
aa <- gapminder %>% arrange(lifeExp)
#- ordena les files de MAJOR a menor segons els valors de la v. lifeExp
aa <- gapminder %>% arrange(desc(lifeExp))
#- ordena les files de MENOR a major segons els valors de la v. lifeExp.
#- Si haguessin empats es resol amb la variable "pop"
aa <- gapminder %>% arrange(lifeExp, pop)
summarize()
per “resumir” variables
summarize()
: agafa una variable com a input i torna un sol valor; per exemple, calcula la mitjana aritmètica (o el mínim, o el màxim…) d’una columna/variableaa <- gapminder %>% summarise(maximo = max(pop)) #- el valor màxim de la variable "pop"
aa <- gapminder %>% summarise(NN = n()) #- el nombre d'observacions
aa <- gapminder %>% summarise(media = mean(lifeExp)) #- la mitjana de la variable "lifeExp"
aa <- gapminder %>% summarise(desviacion_tipica = sd(lifeExp)) #- us ho explicaran a Estadística
summarize()
: “resumim” dues variables
group_by()
: amb aquesta funció ja es pot veure la potència de dplyr
En anàlisi de dades moltes operacions volem calcular-les per a diferents grups (p. ex. dona/home, diferents països, províncies…). group_by()
permet fer-ho
group_by()
agafa un df i el converteix en un “df agrupat”. En aquest nou “df agrupat”, les operacions que fem, es faran per separat per a cadascun dels grups que hàgim definit. Ara ho veiem# ara volem calcular el nombre d'observacions de cada continent
# agafem df i ho (des)agrupem per grups definits per la variable "continent"
# o sigui, hi haurà 5 grups (5 continents)
# després amb summarise() calcularem el nombre d'observacions a cada grup;
# és a dir, ens retornarà un df amb una fila per cada continent
# amb el nombre d'observacions de cada continent
bb <- gapminder %>% group_by(continent) %>% summarise(NN = n())
Fins ara hem treballat amb un únic df, però …
… moltes vegades hem de treballar amb dades que estan a diverses taules
joining df’s
Hi ha diversos tipus d’unions de taules: un bon recurs per a aquests temes és el capítol dedicat a JOINS a R4DS2ed
Les unions més comunes són les “mutating joins”, que afegeixen columnes d’una taula a una altra. Ho veiem:
mutating joins (ajuntant df1
amd df2
)
… es diferencien a les files que se seleccionen
Les files que se seleccionen depenen del criteri per fer el match. Ho veiem:
3/4 tipus de mutating joins
Recorda que totes elles afegeixen columnes (les columnes de df1
a df2
) però que es diferencien a les files que se seleccionen
inner_join(df1,df2)
: retorna les files de df1 que també existeixen a df2left_join(df1,df2)
: retorna TOTES les files de df1full_join(df1,df2)
: retorna TOTES les files de df1 i de df2; (ès à dir, retorna TOTES les files i TOTES les columnes de les 2 taules)mutating joins: un exemple
mutating joins: un exemple
amb dplyr 1.0.0
, el 2020, van aparèixer dues funcions importants: across()
i where()
across()
i where()
: aquestes funcions són una mica diferents, només es fan servir en combinació d’una altra funció/verb. Són 2 funcions que a l’argot del tidyverse no són verbs sinó adverbisExtensió: select()
al costat de la funció where()
[🌶🌶🌶🌶]
select()
i where()
són dues funcions, sí, però a l’argot del tidyverse, select()
és un verb i where()
és un adverbi, qualifica/canvia el que fa select()
.Exemple dús:
A gapminder
les 2 primeres variables (country i continent) són factors i les 4 següents són variable numèriques
Imagina que volem seleccionar només les variables que són numèriques. Podem fer-ho per nom o per posició però millor amb select()
i la funció auxiliar where()
summarise() amb across() : permet fer “resums” de moltes variables
across()
juntament amb summarise()
permet calcular estadístics de totes les variables, o de subconjunts d’aquestes, de manera més còmoda:#- mitjana de cadascuna de les 6 variables.
#- Retorna 2 warnings perquè les 2 primeres són textuals. No es pot calcular la mitjana de continent y country
gapminder %>% summarise(across(everything(), mean) )
#- calculem la mitjana de tercera a la sisena variable
gapminder %>% summarise(across(3:6, mean) )
Pipe nativa ( |> )
Millores a la pipe nativa
En la versió 4.2.0 es millora la pipe nativa introduint un “placeholder”. El placeholder de la pipe nativaés el guió baix: __
Tot i així, la pipe nativa té algunes limitacions: aquí, aquí y aquí