Manipulación y análisis de datos con Tidyverse

Autor/a
Afiliación

Javier Emmanuel Anguiano Pita

Universidad de Guadalajara

Fecha de modificación

27 de diciembre de 2024

Este documento es parte del curso Introducción a la programación en R para Ciencias Sociales

Introducción

En los siguientes ejercicios, trabajaremos con un dataset sobre pingüinos que fue recolectado y publicado por el Dr. Kristen Gorman y la Estación Palmer Station Long Term Ecological Research (LTER) program.

Los datos fueron procesados en Rpor Allison Horst, y se encuentran disponibles para su uso bajo la licencia CC0. Para más información sobre el procesamiento de los datos visiten the palmerpenguins repository.

Los datos para esta práctica están disponibles para su descarga en el siguiente enlace. (Nota: Descomprime el archivo en tu carpeta de trabajo.)

Ejercicio 0

Instala y carga el paqute tidyverse en la memoria de R.

#install.packages("tidyverse")
library(tidyverse) 
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Capítulo 1: Importando datos

Ejercicio 1

En este ejercicio, vamos a importar el archivo penguins.tsv en R.

Para tal propósito, necesistas conocer la ubicación exacta del archivo en tu computadora (Nota: usa el explorador para ubicar la carpeta y utiliza alguna de las funciones que vimos previamente en clase)

Completa el código en el siguiente chunk, reemplazando ??? con el código correcto:

penguins <-  read_tsv("Datos/penguins.tsv")

Ejercicio 2

read_tsv es una función similar a read_csv() que nos permite importar datos tabulares a R. Sin embargo, las funciones no son útiles para leer archivos en formato MS Excel. Por esta razón, nosotros necesitamos un paquete adicional llamado readxl.

readxl se instala en tu computadora cuando instalamos tidyverse, pero no se carga por defecto cuando invocamos library(tidyverse)

Para usar la función, primero debemos invocar el paquete usando el siguiente código:

library(readxl)  # Necesitamos esta librería (.xlsx)
penguins_isotopes <- read_excel("Datos/penguins_isotopes.xlsx")

Usa la función read_excel() para importar el archivo en MS Excel penguins_isotopes.xlsx que está localizado en la carpeta con el material de esta sesión:

penguins_isotopes <- ???(path = "???")

Ejercicio 3

Guarda los datos que importamos en formato .xlsx como un archivo de valores separados por comas (.csv), usando la función write.csv().

Para usar este función, necesitas proveer los siguientes elementos:

  • El nombre del objeto de R que quieres guardar: penguins_isotopes.
  • El nombre de la carpeta y el nombre del archivo: "datos/penguins_isotopes.csv".
write_csv(penguins_isotopes, 
          file = "Datos/penguins_isotopes.csv")

Capítulo 2: Seleccionando y filtrando datos

En este ejercicio vamos a limpiar nuestros datos seleccionando/filtrando únicamente la información que nos interesa.

Ejercicio 4

Para algunos de los pinguinos en el dataset, el sexo no está determinado. Utiliza la función filter() para conservar únicamente las filas en las que la columna Sex especifica si es “FEMALE” o “MALE”.

Una forma de completar esta tarea (no es la única) es filtrar y descartar las filas en donde la variable Sex es NA. Recuerda que puedes usar la función is.na() y que para negar una condición podemos usar el operador !. Por ejemplo, !is.na(NA)nos da como resultado FALSE.

penguins_subset <- filter(penguins, !is.na(Sex))

Ejercicio 5

En este ejercicio vamos a seleccionar las columnas con información que nos interesa analizar más adelante.

Supon que nuestra investigación es sobre el tamaño del pico de los pingüinos (descrito en nuestros datos con el término “Culmen”).

Nos interesa conservar las siguientes variables:

  • Individual_ID
  • Species
  • Sex
  • Island
  • Culmen_Depth_mm
  • Culmen_Length_mm

Usa la función select() para incluir las columnas de nuestro interés en nuestro subconjunto de datos.

Para este ejercicio utiliza el subconjunto de datos del Ejercicio 4. Recuerda que los datos en penguin_subset contienen información completa para todas las observaciones (sin NA's).

penguins_subset2 <- select(penguins_subset, 
                           Individual_ID, Species, Sex,
                           Island, Culmen_Depth_mm, 
                           Culmen_Length_mm)

Ejercicio 6

Usa la función mutate() para crear una nueva columna denominada culmen_ratio que se calcula como la razón entre Culmen_Length_mm dividida por Culmen_Depth_mm.

Asegurate de trabajar con los datos de penguins_subset2

penguins_subset_3 <- mutate(penguins_subset2,
                            culmen_ratio = Culmen_Length_mm / Culmen_Depth_mm)

Ejercicio 7

En el siguiente ejercicio limpiaremos y organizaremos nuestros datos. Antes de eso, renombraremos las columnas Culmen_Length_mm y Culmen_Depth_mm.

Usa la función rename() para renombrar la variable Culmen_Length_mm y denominala length. La variable Culmen_Depth_mm renombrala simplemente depth.

penguins_subset_4 <- rename(penguins_subset_3,
                            length = Culmen_Length_mm, 
                            depth = Culmen_Depth_mm)

Ejercicio 8

Usa %>% (el operador pipe) para combinar el código que escribiste en los Ejercicios 4 a 7.

Asegurate de que tu flujo de trabajo empiece con el objeto penguins y, subsecuentemente, apliques las funciones filter(), select(), mutate() y rename().

penguins_subset_5 <- penguins %>% 
  # Filtrar valores no disponibles (NA's)
  filter(!is.na(Sex)) %>% 
  
  # Seleccionar columnas relevantes
  select(Individual_ID, Species, Sex, Island, 
         starts_with("Culmen")) %>% 
  
  # Añadir una nueva columna (Culmen_ratio)
  mutate(culmen_ratio = Culmen_Length_mm / Culmen_Depth_mm) %>% 
  
  # Renombrar las columnas Culmen
  rename(length = Culmen_Length_mm ,
         depth = Culmen_Depth_mm)

Capítulo 3: Ordenando datos (Tidy data)

Ejercicio 9

Ahora que hemos renombrado las columnas, vamos a transmformar el dataframe de formato ancho (wide) a largo (long) usando la función pivot_longer():

Para tal propósito, necesitamos especificar:

  • ¿Qué columnas se convertiran en filas (usando el argumento cols)?

  • ¿En donde se guardaran los nombres originales de las columnas usando names_to?

  • ¿En donde se guardarn los valores originales de las columnas usando values_to?

penguins_long <- penguins_subset_5 %>%
  pivot_longer(cols = c(length, depth),
               names_to = "culmen_element",
               values_to = "measurement")

penguins_subset_5
penguins_long

Ejercicio 10

Usa las funciones group_by() y summarize() para calcular la media y desviación estándar de todas las mediciones, agrupadas por especie y tipo de medida.

  • En la función group_by(), especifica Species y culmen_element.
  • En el argumento de la función summarize(), usa las funcioens mean() y sd() para calcular el promedio y la desviación estándar de la columna measurement.

Asegurate de usar el dataframe adecuado en tu flujo de trabajo. La columna culment_element la creaste en el ejercicio anterior.

Nota: Puede que aparezca un mensaje de advertencia diciendo que: “summarise() regrouping output by ‘Species’ (override with .groups argument)”. No te preocupes, esperamos este comportamiento de R

penguins_summary <- penguins_long %>%
  group_by(Species, culmen_element) %>%
  summarize(avg = mean(measurement),
            sd = sd(measurement))

Ejercicio 11

Usa la función full_join() para unir los datos de penguins_summaryy penguins_long, de tal forma que cada fila en los datos en formato largo (long) puedan tener columnas adicionales con la media y la desviación estándar de cada grupo.

penguins_join <- full_join(penguins_summary, penguins_long,
                           by = c("Species", "culmen_element"))