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 adverbiosExtensión: select()
junto a la función where()
[🌶🌶🌶🌶]
select()
y where()
son dos funciones, sí, pero en la jerga del tidyverse, select()
es un verbo y where()
es un adverbio, cualifica/cambia lo que hace select()
.Ejemplo de uso:
En gapminder
las 2 primeras variables (country y continent) son factores y las 4 siguientes son variable numéricas.
Imagina que queremos seleccionar sólo las variables que son numéricas. Podemos hacerlo por nombre o por posición pero mejor con select()
y la función auxiliar where()
summarise() con across() : permite hacer “resúmenes” de muchas variables
across()
junto a summarise()
permite calcular estadísticos de todas las variables, o de subconjuntos de estas, de manera más cómoda:#- media de cada una de las 6 variables.
#- Devuelve 2 warnings porque las 2 primeras son textuales. No se puede calcular la media de continent y country
gapminder %>% summarise(across(everything(), mean) )
#- calculamos la media de tercera a la sexta variable
gapminder %>% summarise(across(3:6, mean) )
Pipe nativa ( |> )
Mejoras en la pipe nativa
En la versión 4.2.0 se mejora la pipe nativa introduciendo un “placeholder”. El placeholder de la pipe nativa es el guión bajo: __
Aún así, la pipe nativa tiene algunas limitaciones: aquí, aquí y aquí