10  Actividad: palmerpenguins con dplyr

Instructora: Evelia Coss

Carguemos los paquetes

Código
library(palmerpenguins)
library(dplyr)
library(DT)

10.1 Funciones que vamos a emplear de dplyr

  • select() : Seleccionar nombres de las columnas. –> select(dataframe, columna1, columna2, … columnax)
  • filter() : Filtrar filas por una condicion especifica, apartir de la columna. –> filter(dataframe, columna1 == “condicion”)
  • mutate() : Modificar o agregar columnas. –> mutate(dataframe, columna1 = “condicion”)
  • group_by() : Agrupar informacion de acuerdo a un(as) columna(s) seleccionada(s).
  • if_else() : Condicional. –> if_else(dataframe, codicion, si se acepta entonces, si se rechaza entonces)
  • arrange() : Acomodar los resultados, default de menor a mayor.
  • count(): Cuenta los valores de acuerdo a una variable.
  • left_join() : Unir dos dataframe con base en una misma columna en comun. –> left_join(dataframe1, dataframe2, by = “Columna en comun, mismo nombre”)
  • n_distinct() : Cuenta las filas unicas.
  • distinct() : Muestra las filas duplicadas.
  • summarise() : reduce varios valores seleccionados en un resumen.

10.2 Manos a la obra

En el dataset penguins del paquete palmerpenguins se registran 3 especies de pingüinos:

  • Adelie (Adelia)
  • Chinstrap (Papúa)
  • Gentoo (Barbijo)
  1. Podemos usar R base para identificar esta información:
Código
unique(penguins$species)
[1] Adelie    Gentoo    Chinstrap
Levels: Adelie Chinstrap Gentoo

Emplear las funciones del paquete dplyr:

  1. Usar distinct() para obtener los valores únicos de la columna species.
Código
penguins %>% 
  dplyr::select(species) %>% 
  distinct() # Nos da valores unicos, sin duplicaciones
# A tibble: 3 × 1
  species  
  <fct>    
1 Adelie   
2 Gentoo   
3 Chinstrap
  1. Usar n_distinct() para obtener el número de especies unicas.
Código
penguins %>% 
  dplyr::select(species) %>% 
  n_distinct()
[1] 3
  1. ¿Cuántos datos registrados tenemos por especies o número de individuos por especie?
Código
penguins %>% 
  count(species) 
# A tibble: 3 × 2
  species       n
  <fct>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124

Ahora vamos a ver la distribución de las especies por islas:

Imagen creada con Gemini.
  1. Número de individuos de cada sexo
Código
penguins %>% 
  count(sex) 
# A tibble: 3 × 2
  sex        n
  <fct>  <int>
1 female   165
2 male     168
3 <NA>      11
  1. ¿Cuántos hembras y machos hay de cada especie?
Código
penguins %>% 
  count(species, sex)
# A tibble: 8 × 3
  species   sex        n
  <fct>     <fct>  <int>
1 Adelie    female    73
2 Adelie    male      73
3 Adelie    <NA>       6
4 Chinstrap female    34
5 Chinstrap male      34
6 Gentoo    female    58
7 Gentoo    male      61
8 Gentoo    <NA>       5
  1. Número de individuos registrados en cada isla:
Código
penguins %>% 
  count(island)
# A tibble: 3 × 2
  island        n
  <fct>     <int>
1 Biscoe      168
2 Dream       124
3 Torgersen    52
  1. Número de individuos registrados en cada isla:
Código
penguins %>% 
  count(species, island, sex)
# A tibble: 13 × 4
   species   island    sex        n
   <fct>     <fct>     <fct>  <int>
 1 Adelie    Biscoe    female    22
 2 Adelie    Biscoe    male      22
 3 Adelie    Dream     female    27
 4 Adelie    Dream     male      28
 5 Adelie    Dream     <NA>       1
 6 Adelie    Torgersen female    24
 7 Adelie    Torgersen male      23
 8 Adelie    Torgersen <NA>       5
 9 Chinstrap Dream     female    34
10 Chinstrap Dream     male      34
11 Gentoo    Biscoe    female    58
12 Gentoo    Biscoe    male      61
13 Gentoo    Biscoe    <NA>       5

Crea una nueva columna llamada body_mass_kg que convierta el peso de gramos a kilogramos.

Código
penguins_kg <- penguins %>% 
  mutate(body_mass_kg = body_mass_g / 1000) 

head(penguins_kg)
# 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           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 3 more variables: sex <fct>, year <int>, body_mass_kg <dbl>

Calcula el promedio de masa corporal por especie.

Código
penguins_kg %>% 
  group_by(species) %>% 
  summarise(mean_mass_kg = mean(body_mass_kg, na.rm = TRUE))
# A tibble: 3 × 2
  species   mean_mass_kg
  <fct>            <dbl>
1 Adelie            3.70
2 Chinstrap         3.73
3 Gentoo            5.08

Crea una columna peso_categoria que indique "Ligero" si el pingüino pesa menos de 4000 g = 4kg y "Pesado" en caso contrario.

Código
penguins_kg <- penguins_kg %>% 
  mutate(peso_categoria = if_else(body_mass_kg < 4, "Ligero", "Pesado"))

head(penguins_kg)
# A tibble: 6 × 10
  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           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 4 more variables: sex <fct>, year <int>, body_mass_kg <dbl>,
#   peso_categoria <chr>

¿Cuántos pingüinos tenemos por categoría?

Código
penguins_kg %>% 
  count(peso_categoria)
# A tibble: 3 × 2
  peso_categoria     n
  <chr>          <int>
1 Ligero           165
2 Pesado           177
3 <NA>               2

Clasifica a los pingüinos en categorías según su masa corporal:

  • < 3500 g"Pequeño"
  • 3500–4500 g"Mediano"
  • > 4500 g"Grande"
Código
penguins_kg %>% 
  mutate(categoria = case_when(
    body_mass_g < 3500 ~ "Pequeño",
    body_mass_g >= 3500 & body_mass_g <= 4500 ~ "Mediano",
    body_mass_g > 4500 ~ "Grande"
  ))
# A tibble: 344 × 11
   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           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 5 more variables: sex <fct>, year <int>, body_mass_kg <dbl>,
#   peso_categoria <chr>, categoria <chr>

Ordena los pingüinos por longitud del pico (bill_length_mm) de mayor a menor.

Código
penguins_kg %>% 
  arrange(desc(bill_length_mm)) %>%  # de mayor a menor
  # tambien se puede poner arrange(-bill_length_mm)
  head()
# A tibble: 6 × 10
  species   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>     <fct>           <dbl>         <dbl>             <int>       <int>
1 Gentoo    Biscoe           59.6          17                 230        6050
2 Chinstrap Dream            58            17.8               181        3700
3 Gentoo    Biscoe           55.9          17                 228        5600
4 Chinstrap Dream            55.8          19.8               207        4000
5 Gentoo    Biscoe           55.1          16                 230        5850
6 Gentoo    Biscoe           54.3          15.7               231        5650
# ℹ 4 more variables: sex <fct>, year <int>, body_mass_kg <dbl>,
#   peso_categoria <chr>

Si queremos que sea de menor a mayor, quitamos desc().

Código
penguins_kg %>% 
  arrange(bill_length_mm) %>%  # de menor a mayor
  head()
# A tibble: 6 × 10
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Dream               32.1          15.5               188        3050
2 Adelie  Dream               33.1          16.1               178        2900
3 Adelie  Torgersen           33.5          19                 190        3600
4 Adelie  Dream               34            17.1               185        3400
5 Adelie  Torgersen           34.1          18.1               193        3475
6 Adelie  Torgersen           34.4          18.4               184        3325
# ℹ 4 more variables: sex <fct>, year <int>, body_mass_kg <dbl>,
#   peso_categoria <chr>

Calcula el promedio y la desviación estándar de la longitud del ala (flipper_length_mm) por especie.

Código
penguins %>% 
  group_by(species) %>% 
  summarise(
    mean_flipper = mean(flipper_length_mm, na.rm = TRUE), #promedio
    sd_flipper = sd(flipper_length_mm, na.rm = TRUE) # desviacion estandar
  )
# A tibble: 3 × 3
  species   mean_flipper sd_flipper
  <fct>            <dbl>      <dbl>
1 Adelie            190.       6.54
2 Chinstrap         196.       7.13
3 Gentoo            217.       6.48