Módulo práctico de ITA
(Grupo M)
Aprendimos a cargar datos y a hacerlos TIDY, pero es raro que los datos estén preparados para empezar nuestro análisis, así que hay que “arreglar/limpiar” los datos
Arreglando los datos
dplyr es el paquete más importante a la hora de manipular datos.dplyr
dplyr es un paquete que permite manipular datos de forma intuitivaTiene 6-7 funciones (o verbos) principales
%>%)sintaxis de dplyr
Todas las funciones tienen una estructura o comportamiento similar:
el primer argumento siempre es un df
los siguientes argumentos describen que hacer con los datos.
el resultado es siempre un nuevo df
principales funciones de dplyr
select() : selecciona columnasfilter() : filtra/selecciona filas (que cumplen una o varias condiciones)mutate() : crea nuevas columnas (variables)arrange(): reordena las filasrename() : cambia los nombres de las columnassummarise() : resume (colapsa) los valores de una columna a un solo valor. Por ejemplo, calcula la media, máximo, mínimo, etc…hay una séptima función (que da mucha potencia a dplyr)
group_by() : “agrupa” filas (en función de una o varias condiciones)dplyr con ejemplostrabajaremos con datos del pkg gapminder
¿Supongo que ya sabéis que hace el siguiente código?
gapminder que está en el paquete gapminderselect() se utiliza para seleccionar variables
A veces queremos reordenar las columnas/variables
relocate()A veces queremos renombrar las columnas
rename()la función names() de R-base es útil
A veces queremos CREAR nuevas columnas
Podemos hacerlo con mutate()
Por ejemplo, podemos crear la variable: GDP = pop * gdpperCap
filter(): permite seleccionar filas
filas que cumplan una determinadas condiciones o criterios lógicos
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() es una variante de filter()
permite seleccionar filas pero por posición
filter() y slice() ambas seleccionan filas, la primera por condiciones y la segunda por posición:variantes de slice()
slice_max() y slice_min(): seleccionan filas con valor máximo (o mínimo) de una variable:#- selecciona las 3 filas con mayor valor de lifeExp
aa <- gapminder %>% slice_max(lifeExp, n = 3)
#- selecciona las 4 filas con MENOR valor de pop
aa <- gapminder %>% slice_min(pop, n = 4)
#- observaciones en el primer décil en cuanto a esperanza de vida, 10% con menor esperanza de vida
aa <- gapminder %>% slice_min(lifeExp, prop = 0.1)
#- 1% de observaciones con mayor población. Imagino que estarán China e India
aa <- gapminder %>% slice_max(pop, prop = 0.01)variantes de slice()
slice_sample(): permite obtener una muestra aleatoria de los datosarrange(): permite reordenar las filas de un df
#- ordena las filas de MENOR a mayor según los valores de la v. lifeExp
aa <- gapminder %>% arrange(lifeExp)
#- ordena las filas de MAYOR a menor según los valores de la v. lifeExp
aa <- gapminder %>% arrange(desc(lifeExp))
#- ordena las filas de MENOR a mayor según los valores de la v. lifeExp.
#- Si hubiesen empates se resuelve con la variable "pop"
aa <- gapminder %>% arrange(lifeExp, pop) summarize() para “resumir” variables
summarize(): coge una variable como input y devuelve un solo valor; por ejemplo, calcula la media aritmética (o el mínimo, o el máximo …) de una columna/variableaa <- gapminder %>% summarise(maximo = max(pop)) #- el valor máximo de la variable "pop"
aa <- gapminder %>% summarise(NN = n()) #- el número de observaciones
aa <- gapminder %>% summarise(media = mean(lifeExp)) #- la media de la variable "lifeExp"
aa <- gapminder %>% summarise(desviacion_tipica = sd(lifeExp)) #- os lo explicarán en Estadística summarize(): “resumimos” dos variables
group_by(): con está función ya se puede ver la potencia de dplyr
En análisis de datos muchas operaciones queremos calcularlas para distintos grupos (p. ej. mujer/hombre, diferentes países, provincias …). group_by() permite hacerlo.
group_by() coge un df y lo convierte en un “df agrupado”. En ese nuevo “df agrupado”, las operaciones que hagamos, se harán por separado para cada uno de los grupos que hayamos definido. Ahora lo vemos.# ahora queremos calcular el nº de observaciones de cada continente
# cogemos df y lo (des)agrupamos por grupos definidos por la variable "continent"
# o sea, habrá 5 grupos (5 continentes)
# después con summarise() calcularemos el nº de observaciones en cada grupo;
# es decir, nos retornará un df con una fila por cada continente
# con el nº de observaciones de cada continente
bb <- gapminder %>% group_by(continent) %>% summarise(NN = n())Hasta ahora hemos trabajado con un único df, pero …
… muchas veces tenemos que trabajar con datos que están en varias tablas
joining df’s
Hay diversos tipos de uniones de tablas: un buen recurso para estos temas es el capítulo dedicado a JOINS en R4DS2ed
Las uniones más comunes son las “mutating joins”, que añaden columnas de una tabla a otra. Lo vemos:
mutating joins (juntando df1 con df2)
… se diferencian en las filas que se seleccionan
Las filas que se seleccionan dependen del criterio para hacer el match. Lo vemos:
3/4 tipos de mutating joins
Recuerda que todas ellas añaden columnas (las columnas de df1 a df2) pero que se diferencian en las filas que se seleccionan
inner_join(df1,df2): retorna las filas de df1 que también existen en df2left_join(df1,df2): retorna TODAS las filas de df1full_join(df1,df2): retorna TODAS las filas de df1 y de df2; (osea, retorna TODAS las filas y TODAS las columnas de las 2 tablas)mutating joins: un ejemplo
mutating joins: un ejemplo
con dplyr 1.0.0, en 2020, aparecieron dos funciones importantes: across() y where()
across() y where(): estas funciones son un poco diferentes, solo se usan en combinación de otra función/verbo. Son 2 funciones que en la jerga del tidyverse no son verbos sino adverbios, cualifican/cambian lo que hacen otras funciones como select()Ejemplo de uso: select() junto a la función where() [🌶🌶🌶🌶]
gapminder las 2 primeras variables (country y continent) son factores y las 4 siguientes son variable numéricas.select() y where()más ejemplos de across() y where()
gapminder. Tendríamos que repetir código 6 veces … o usar across()across() y where() con summarise() 😱
Dentro de across() se puede utilizar where()
Con esto conseguimos poder aplicar criterios lógicos en la selección de variables: [🌶] [ 🌟 ]