library(dplyr)
library(tidyr)
library(palmerpenguins)
library(writexl)
library(janitor)
library(knitr)
library(rmarkdown)
# 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>
n_distinct
y Contar
Filas con count
# 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 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
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>
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
# 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
# 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>
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>
# 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>
# Exportar a un archivo Excel
write_xlsx(penguins_extended, "penguins_final.xlsx")