knitr::opts_chunk$set(echo=TRUE)
Tidyverse es un conjunto de paquetes de R que comparten una misma filosofía y estructuras de datos, diseñados para:
# Carguemos los paquetes que usaremos
library(tidyr)
library(dplyr)
library(readr)
library(ggplot2)
birds <- read_csv("../datos/medidasaves_2025.csv")
head(birds)
%>%)%>%) es una herramienta fundamental en el tidyverse.ctrl + shift + M.# sin pipes
res1 <- birds[which(birds$Department == "Antioquia"),]
res2 <- res1[,c("Species", "Sex")]
head(res2)
# Con pipes
res <- birds %>%
filter(Department == "Antioquia") %>%
select(Species, Sex) %>%
slice_head(n = 10)
res
dplyr, tidyr, ggplot2, etc.Datos ordenados (“tidy data”) es un concepto fundamental en el análisis de datos con R y tidyverse.
| Locality | Elevation | Species | Weight |
|---|---|---|---|
| Valle del Cauca | 3500 | Accipiter stria | 103.36 |
| Antioquia | 3407 | Adelomyia me | 4 |
| Quindio | 2970 | Accipiter stria | 108.33 |
NA y no "" o 0.dplyrfilter(): Selecciona filas según condiciones lógicas.select(): Elige columnas específicas del dataframe.mutate(): Crea o transforma columnas.arrange(): Ordena filas por una o más variables.summarise(): Resume/consolida información en el dataframe.group_by(): Agrupa datos para operaciones posteriores.rename(): Cambia el nombre de una columna.dplyrbirds_filter1 <- birds %>%
select(Department, Species, Weight) %>% # Quiero seleccionar solo las columnas Department, Species, Weight
filter(Department %in% c("Quindio", "Antioquia")) %>% # Quiero filtrar las especies del Amazonas y Antioquia
group_by(Department, Species) %>% # Quiero agrupar por especie
drop_na() %>% # Eliminar los NA
summarise(mean_weight = mean(Weight), n_individuos = n()) %>% # Contar el número de individuos por especie registrados
arrange(desc(mean_weight)) %>% # Presentarlas ordenadas de mayor a menor peso
mutate(mean_weight_mg = mean_weight/1000) %>% # Presentar el peso en mg
rename(media_peso_mg = mean_weight_mg)
head(birds_filter1)
Otros operadores importantes que no debemos dejar pasar son:
& es el operador “y” (AND): Devuelve TRUE solo si ambas condiciones son verdaderas.| es el operador “o” (OR): Devuelve TRUE si al menos una condición es verdadera.! es el operador “no” (NOT): Invierte el valor lógico (TRUE a FALSE y viceversa).¿Qué especies están en Antioquia Y por encima de los 2500m?
birds %>%
select(Department, Species, Elevation) %>%
filter(Department == "Antioquia" & Elevation > 2500) %>%
group_by(Species) %>%
summarise(n_individuos = n())
¿Qué especies están en Antioquia o en Quindio?
birds %>%
select(Department, Species, Elevation) %>%
filter(Department == "Antioquia" | Department == "Quindio") %>%
group_by(Species) %>%
summarise(n_individuos = n())
separate(): Divide una columna en varias columnas.unite(): Une varias columnas en una sola columna.drop_na(): Elimina filas con valores NA.fill(): Rellena valores faltantes con el valor anterior o siguiente.birds %>%
dplyr::select(Species, wingArea) %>%
separate(col = "Species", into = c("Genus", "Specie"), sep = " ") %>%
drop_na()
# Ahora probemos fill()
Familia de funciones slice_ para obtener máximos, mínimos, muestreos aleatorios, etc.
birds %>% select(Species, Weight) %>% slice_max(Weight, n = 5) # las 5 aves más pesadas
birds %>% select(Species, Weight) %>% slice_min(Weight, n = 5) # las 5 aves más ligeras
birds %>% select(Species, Weight) %>% slice_sample(n = 5) # muestra aleatoria de 5 aves
_join 🗎+🗎taxon <- read_csv("../datos/taxon_info_2025.csv")
birds %>% select(Species, Weight) %>% right_join(taxon)
! devuelve el complemento
birds %>% select(!c(rightsHolder, basisOfRecord, institutionCode, collectionCode, catalogNumber,
recordedBy, Source, Date))
where()Selecciona las variables para las cuales alguna comparación regrese TRUE
birds %>% select(where(is.numeric)) %>% head()
matches()Encuentra nombres de variables con expresiones regulares
birds %>% select(matches("tail")) %>% head()
:Selecciona variables contiguas
birds %>% select(Species:billDepth) %>% head()
-Otra forma de eliminar variables (columnas)
birds %>% select(-c(rightsHolder:Source, Date))
stringrstringrstr_detect(): Detecta patrones en cadenas.str_replace(): Reemplaza partes de cadenas.str_split(): Divide cadenas en partes.str_to_lower() y str_to_upper(): Cambia el caso de las letras.str_trim(): Elimina espacios en blanco al inicio y final.Vamos a practicar cómo reformatear datos entre formato ancho y largo usando las funciones pivot_longer() y pivot_wider() del paquete tidyr.
# Datos en formato ancho
birds_ex <- tibble(
Species = c("Accipiter stria", "Adelomyia me"),
Weight_2022 = c(103.36, 4),
Weight_2023 = c(105.00, 4.2)
)
print(birds_ex)
pivot_longer()Transforma varias columnas en filas para análisis flexibles.
long_birds <- birds_ex %>%
pivot_longer(cols = starts_with("Weight"),
names_to = "Year",
values_to = "Weight")
print(long_birds)
pivot_wider()Agrupa filas en columnas para comparaciones directas.
wide_birds <- long_birds %>%
pivot_wider(names_from = Year,
values_from = Weight)
print(wide_birds)
Resumir la tabla birds para saber cuántas especies hay en cada Departamento
dep_birds <- birds %>% select(lifeStage, n) %>%
pivot_wider(names_from = lifeStage,
values_from = n)
print(dep_birds)
data(package = "ggplot2")
data(diamonds)
head(diamonds)