Curso de Introducción a R (SFPIE)
(Web del curso aquí)
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)Extensión: across()
y where()
dplyr 1.0.0
, en mayo de 2020, aparecieron dos funciones importantes más: 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.
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())
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: [🌶] [ 🌟 ]
Si quisiéramos calcular la media de las variables numéricas
summarise() con across() y varias funciones 😱😱😱😱
Si quieres calcular varios estadísticos de varias variables; por ejemplo, la media y la desviación típica de un grupo de variables
Tendrás que seguir utilizando summarise()
con across()
pero, además, tendrás que poner la lista de funciones dentro de list()
. [🌶] [ 🌟 ]
Si quisiéramos calcular la media y la desviación típica de las variables 3 a 6
Otra vez, no os asustéis de lo que salga: es lo mismo que lo de arriba pero con los nombres de los argumentos
Ya lo último: añadimos un argumento más .names
, que nos permite controlar el nombre de las nuevas variables
Más ejemplos para afianzar el uso de across()
Creamos un nuevo df: “gapminder_gr” o “gapminder agrupado”
Hacemos cálculos partiendo de “gapminder_gr”. Recuerda que esta “agrupado” por continente y año
#- si queremos calcular la media de varias variables tenemos que usar across()
gapminder_gr %>% summarise(across(c(lifeExp, gdpPercap), mean))
#- si queremos calcular la media de todas las variables numéricas tenemos que usar across() y where()
gapminder_gr %>% summarise(across(where(is.numeric), mean))
#- si queremos calcular la media y la mediana, hay que usar list()
gapminder_gr %>% summarise(across(c(lifeExp, gdpPercap),
list (media = mean, mediana = median) ))
#- si ponemos los nombres de los argumentos quedaría como
gapminder_gr %>% summarise(across(.cols = c(lifeExp, gdpPercap),
.fns = list (media = mean, mediana = median)))
#- además, podemos controlar el nombre de las variables creadas con el argumento .names
gapminder_gr %>% summarise(across(c(lifeExp, gdpPercap),
list (media = mean, mediana = median),
.names = "{fn}_{col}"))
dplyr
Seguimos con más ejemplos para afianzar nuestros conocimientos
Empezamos con ejemplos sencillos; pronto llegaremos a “preguntas de verdad”
vimos ya la la “teoría” del tidyverse
dplyr
es el paquete más importante a la hora de manipular datos.select()
, filter()
, mutate()
, arrange()
, rename
, summarise()
y group_by()
.%>%
)para aprender a manipular datos con dplyr
Es importante saber cómo contar las observaciones que tenemos en distintos grupos
Por ejemplo, contar cuantas mujeres hay, o cuantas observaciones hay en cada continente, o cuantas empresas en diferentes sectores, …
… vamos a CONTAR
tenemos 3 formas distintas de contar el nº de observaciones (o filas)
1. Usando mutate()
con n()
2. Usando summarise()
con n()
… seguimos CONTANDO
Pero ahora contamos el nº de observaciones de distintos grupos (por ejemplo el nº de observaciones de cada continente)
mutate()
pero esta vez solo usaremos summarise()
y count()
… aún seguimos CONTANDO
Contamos el nº de observaciones de distintos grupos, pero ahora definidos por dos variables (por ejemplo el nº de observaciones de cada continente y año)
Extensión: n()
versus nrow()
n()
es una función auxiliar en el tidyverse. Devuelve en nº de filas “in the current group”. Solo funciona en el tidyverse, concretamente en funciones como mutate()
y summarise()