Seccion 1: Instalar y Cargar Librerías

library(dplyr)
library(tidyr)
library(palmerpenguins)
library(writexl)
library(janitor)
library(knitr)
library(rmarkdown)

Paso 2: Cargar y Limpiar los Datos

  • El dataset penguins contiene datos sobre las especies de pingüinos y algunas características físicas.
# Cargar el dataset
data("penguins")

# Limpiar los datos removiendo NA y limpiando nombres de columnas
penguins_clean <- penguins %>%
  janitor::clean_names() %>%   # Limpia los nombres de las columnas
  drop_na()                    # Elimina las filas con NA

# Verificar los primeros datos limpios
head(penguins_clean)
## # A tibble: 6 × 8
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## 4 Adelie  Torgersen           36.7          19.3               193        3450
## 5 Adelie  Torgersen           39.3          20.6               190        3650
## 6 Adelie  Torgersen           38.9          17.8               181        3625
## # ℹ 2 more variables: sex <fct>, year <int>

Paso 3: Contar Valores Únicos con n_distinct y Contar Filas con count

  • Contar valores únicos: Vamos a contar cuántas especies diferentes de pingüinos tenemos en el dataset.
# Contar especies únicas con n_distinct
num_especies <- penguins_clean %>%
  summarise(total_especies = n_distinct(species))

num_especies
## # A tibble: 1 × 1
##   total_especies
##            <int>
## 1              3
  • Contar filas agrupadas: Ahora contamos cuántos pingüinos hay en cada especie usando count.
# Contar el número de pingüinos por especie
pingüinos_por_especie <- penguins_clean %>%
  count(species)

pingüinos_por_especie
## # A tibble: 3 × 2
##   species       n
##   <fct>     <int>
## 1 Adelie      146
## 2 Chinstrap    68
## 3 Gentoo      119

Paso 4: Reemplazar Valores con replace

  • Ahora vamos a reemplazar valores específicos en una columna usando replace. Supongamos que queremos cambiar el valor “male” en la columna sex por “Macho”.
# Reemplazar el valor "male" por "Macho"
penguins_replaced <- penguins_clean %>%
  mutate(sex = replace(sex, sex == "male", "Macho"))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `sex = replace(sex, sex == "male", "Macho")`.
## Caused by warning in `[<-.factor`:
## ! invalid factor level, NA generated
# Verificar los cambios
head(penguins_replaced)
## # A tibble: 6 × 8
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## 4 Adelie  Torgersen           36.7          19.3               193        3450
## 5 Adelie  Torgersen           39.3          20.6               190        3650
## 6 Adelie  Torgersen           38.9          17.8               181        3625
## # ℹ 2 more variables: sex <fct>, year <int>

Paso 5: Reemplazar Valores Específicos en Todo un DataFrame

Supongamos que queremos reemplazar cualquier valor de masa corporal mayor a 5000g con el valor 5000 para hacer el análisis más sencillo.

# Reemplazar valores mayores a 5000 en body_mass_g por 5000
penguins_adjusted <- penguins_clean %>%
  mutate(body_mass_g = replace(body_mass_g, body_mass_g > 5000, 5000))

# Verificar los cambios
summary(penguins_adjusted$body_mass_g)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2700    3550    4050    4115    4775    5000

Paso 6: Manejo de Datos Faltantes

  • Supongamos que queremos manejar los valores faltantes de manera diferente. En lugar de eliminarlos, podemos imputar los valores faltantes de la masa corporal con la media.
# Imputar NA con la media de "body_mass_g"
penguins_imputed <- penguins %>%
  mutate(body_mass_g = ifelse(is.na(body_mass_g), mean(body_mass_g, na.rm = TRUE), body_mass_g))

# Verificar imputación
summary(penguins_imputed$body_mass_g)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2700    3550    4050    4202    4750    6300

Paso 7: Transformación de Variables

  • Vamos a crear una nueva columna que convierta la masa corporal de gramos a kilogramos.
# Crear nueva columna 'body_mass_kg'
penguins_transformed <- penguins_clean %>%
  mutate(body_mass_kg = body_mass_g / 1000)

# Ver las primeras filas con la nueva columna
head(penguins_transformed)
## # A tibble: 6 × 9
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## 4 Adelie  Torgersen           36.7          19.3               193        3450
## 5 Adelie  Torgersen           39.3          20.6               190        3650
## 6 Adelie  Torgersen           38.9          17.8               181        3625
## # ℹ 3 more variables: sex <fct>, year <int>, body_mass_kg <dbl>

Paso 8: Unión de DataFrames

  • Imaginemos que tenemos un dataframe adicional con información sobre las islas. Vamos a unirlo con los datos de pingüinos usando un left_join .
# Crear un dataframe con información sobre las islas
islas_info <- data.frame(
  island = c("Torgersen", "Biscoe", "Dream"),
  region = c("Antártida Oeste", "Antártida Este", "Antártida Oeste"),
  num_estaciones = c(1, 3, 2)
)

# Unir los datasets usando left_join
penguins_joined <- penguins_transformed %>%
  left_join(islas_info, by = "island")

# Ver el dataframe resultante
head(penguins_joined)
## # A tibble: 6 × 11
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <chr>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## 4 Adelie  Torgersen           36.7          19.3               193        3450
## 5 Adelie  Torgersen           39.3          20.6               190        3650
## 6 Adelie  Torgersen           38.9          17.8               181        3625
## # ℹ 5 more variables: sex <fct>, year <int>, body_mass_kg <dbl>, region <chr>,
## #   num_estaciones <dbl>

Paso 9: Agregar Nuevas Filas y Columnas

  • A continuación, agregamos una nueva fila de datos ficticia y una nueva columna que clasifica la masa corporal en categorías.
# Agregar una nueva fila ficticia
new_row <- data.frame(
  species = "Adelie",
  island = "Biscoe",
  bill_length_mm = 45.0,
  bill_depth_mm = 14.5,
  flipper_length_mm = 210,
  body_mass_g = 4000,
  sex = "female",
  body_mass_kg = 4.0,
  region = "Antártida Este",
  num_estaciones = 3
)

penguins_extended <- bind_rows(penguins_joined, new_row)

# Agregar una nueva columna de clasificación de masa corporal
penguins_extended <- penguins_extended %>%
  mutate(body_mass_category = case_when(
    body_mass_g < 3000 ~ "Bajo",
    body_mass_g >= 3000 & body_mass_g <= 4000 ~ "Medio",
    TRUE ~ "Alto"
  ))

# Verificar el dataframe actualizado
tail(penguins_extended)
## # A tibble: 6 × 12
##   species   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <chr>     <chr>           <dbl>         <dbl>             <dbl>       <dbl>
## 1 Chinstrap Dream            55.8          19.8               207        4000
## 2 Chinstrap Dream            43.5          18.1               202        3400
## 3 Chinstrap Dream            49.6          18.2               193        3775
## 4 Chinstrap Dream            50.8          19                 210        4100
## 5 Chinstrap Dream            50.2          18.7               198        3775
## 6 Adelie    Biscoe           45            14.5               210        4000
## # ℹ 6 more variables: sex <chr>, year <int>, body_mass_kg <dbl>, region <chr>,
## #   num_estaciones <dbl>, body_mass_category <chr>

Paso 10: Exportar a Excel

  • Finalmente, exportamos el dataframe resultante a un archivo Excel.
# Exportar a un archivo Excel
write_xlsx(penguins_extended, "penguins_final.xlsx")