Ejercicio práctico con dplyr

Objetivo

En este ejercicio aprenderemos a utilizar las principales funciones del paquete dplyr:

select()
filter()
arrange()
mutate()
summarise()

Trabajaremos con una base de datos sintética de semillas.


1. Cargar el paquete

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

2. Crear la base de datos

La base contiene 12 semillas y las siguientes variables:

  • id: identificador;
  • especie: tipo de semilla;
  • peso_g: peso en gramos;
  • largo_mm: largo en milímetros;
  • humedad_pct: porcentaje de humedad;
  • germinacion_dias: días necesarios para germinar.
semillas <- data.frame(
  id = 1:12,
  especie = c(
    "Trigo", "Trigo", "Trigo", "Trigo",
    "Maiz", "Maiz", "Maiz", "Maiz",
    "Cebada", "Cebada", "Cebada", "Cebada"
  ),
  peso_g = c(
    0.42, 0.47, 0.39, 0.51,
    0.31, 0.35, 0.38, 0.33,
    0.28, 0.30, 0.27, 0.32
  ),
  largo_mm = c(
    6.2, 6.8, 5.9, 7.1,
    8.5, 9.1, 8.8, 9.4,
    5.5, 5.8, 5.3, 6.0
  ),
  humedad_pct = c(
    11.2, 12.5, 10.8, 13.1,
    14.5, 15.2, 13.9, 16.0,
    9.8, 10.4, 9.5, 11.0
  ),
  germinacion_dias = c(
    5, 4, 6, 4,
    7, 6, 5, 6,
    8, 7, 9, 7
  )
)

semillas
##    id especie peso_g largo_mm humedad_pct germinacion_dias
## 1   1   Trigo   0.42      6.2        11.2                5
## 2   2   Trigo   0.47      6.8        12.5                4
## 3   3   Trigo   0.39      5.9        10.8                6
## 4   4   Trigo   0.51      7.1        13.1                4
## 5   5    Maiz   0.31      8.5        14.5                7
## 6   6    Maiz   0.35      9.1        15.2                6
## 7   7    Maiz   0.38      8.8        13.9                5
## 8   8    Maiz   0.33      9.4        16.0                6
## 9   9  Cebada   0.28      5.5         9.8                8
## 10 10  Cebada   0.30      5.8        10.4                7
## 11 11  Cebada   0.27      5.3         9.5                9
## 12 12  Cebada   0.32      6.0        11.0                7

3. select()

La función select() permite seleccionar columnas.

Por ejemplo:

semillas %>%
  select(especie, peso_g, humedad_pct)
##    especie peso_g humedad_pct
## 1    Trigo   0.42        11.2
## 2    Trigo   0.47        12.5
## 3    Trigo   0.39        10.8
## 4    Trigo   0.51        13.1
## 5     Maiz   0.31        14.5
## 6     Maiz   0.35        15.2
## 7     Maiz   0.38        13.9
## 8     Maiz   0.33        16.0
## 9   Cebada   0.28         9.8
## 10  Cebada   0.30        10.4
## 11  Cebada   0.27         9.5
## 12  Cebada   0.32        11.0

La lógica es:

\[ \text{base completa} \rightarrow \text{seleccionar variables} \]

Ejercicio 1

Seleccione solamente:

  • id
  • especie
  • germinacion_dias
semillas %>%
  select(id, especie, germinacion_dias)
##    id especie germinacion_dias
## 1   1   Trigo                5
## 2   2   Trigo                4
## 3   3   Trigo                6
## 4   4   Trigo                4
## 5   5    Maiz                7
## 6   6    Maiz                6
## 7   7    Maiz                5
## 8   8    Maiz                6
## 9   9  Cebada                8
## 10 10  Cebada                7
## 11 11  Cebada                9
## 12 12  Cebada                7

4. filter()

La función filter() permite seleccionar filas que cumplen una condición.

Seleccione semillas cuyo peso sea mayor que 0.35 gramos:

semillas %>%
  filter(peso_g > 0.35)
##   id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  1   Trigo   0.42      6.2        11.2                5
## 2  2   Trigo   0.47      6.8        12.5                4
## 3  3   Trigo   0.39      5.9        10.8                6
## 4  4   Trigo   0.51      7.1        13.1                4
## 5  7    Maiz   0.38      8.8        13.9                5

Seleccione solamente semillas de trigo:

semillas %>%
  filter(especie == "Trigo")
##   id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  1   Trigo   0.42      6.2        11.2                5
## 2  2   Trigo   0.47      6.8        12.5                4
## 3  3   Trigo   0.39      5.9        10.8                6
## 4  4   Trigo   0.51      7.1        13.1                4

Ejercicio 2

Seleccione semillas cuya humedad sea mayor que 12%.

semillas %>%
  filter(humedad_pct > 12)
##   id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  2   Trigo   0.47      6.8        12.5                4
## 2  4   Trigo   0.51      7.1        13.1                4
## 3  5    Maiz   0.31      8.5        14.5                7
## 4  6    Maiz   0.35      9.1        15.2                6
## 5  7    Maiz   0.38      8.8        13.9                5
## 6  8    Maiz   0.33      9.4        16.0                6

Ejercicio 3

Seleccione semillas de maíz cuya germinación sea menor o igual a 6 días.

semillas %>%
  filter(
    especie == "Maiz",
    germinacion_dias <= 6
  )
##   id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  6    Maiz   0.35      9.1        15.2                6
## 2  7    Maiz   0.38      8.8        13.9                5
## 3  8    Maiz   0.33      9.4        16.0                6

5. arrange()

La función arrange() permite ordenar las observaciones.

Ordenar por peso de menor a mayor:

semillas %>%
  arrange(peso_g)
##    id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  11  Cebada   0.27      5.3         9.5                9
## 2   9  Cebada   0.28      5.5         9.8                8
## 3  10  Cebada   0.30      5.8        10.4                7
## 4   5    Maiz   0.31      8.5        14.5                7
## 5  12  Cebada   0.32      6.0        11.0                7
## 6   8    Maiz   0.33      9.4        16.0                6
## 7   6    Maiz   0.35      9.1        15.2                6
## 8   7    Maiz   0.38      8.8        13.9                5
## 9   3   Trigo   0.39      5.9        10.8                6
## 10  1   Trigo   0.42      6.2        11.2                5
## 11  2   Trigo   0.47      6.8        12.5                4
## 12  4   Trigo   0.51      7.1        13.1                4

Ordenar de mayor a menor:

semillas %>%
  arrange(desc(peso_g))
##    id especie peso_g largo_mm humedad_pct germinacion_dias
## 1   4   Trigo   0.51      7.1        13.1                4
## 2   2   Trigo   0.47      6.8        12.5                4
## 3   1   Trigo   0.42      6.2        11.2                5
## 4   3   Trigo   0.39      5.9        10.8                6
## 5   7    Maiz   0.38      8.8        13.9                5
## 6   6    Maiz   0.35      9.1        15.2                6
## 7   8    Maiz   0.33      9.4        16.0                6
## 8  12  Cebada   0.32      6.0        11.0                7
## 9   5    Maiz   0.31      8.5        14.5                7
## 10 10  Cebada   0.30      5.8        10.4                7
## 11  9  Cebada   0.28      5.5         9.8                8
## 12 11  Cebada   0.27      5.3         9.5                9

Ejercicio 4

Ordene las semillas desde la menor hasta la mayor humedad.

semillas %>%
  arrange(humedad_pct)
##    id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  11  Cebada   0.27      5.3         9.5                9
## 2   9  Cebada   0.28      5.5         9.8                8
## 3  10  Cebada   0.30      5.8        10.4                7
## 4   3   Trigo   0.39      5.9        10.8                6
## 5  12  Cebada   0.32      6.0        11.0                7
## 6   1   Trigo   0.42      6.2        11.2                5
## 7   2   Trigo   0.47      6.8        12.5                4
## 8   4   Trigo   0.51      7.1        13.1                4
## 9   7    Maiz   0.38      8.8        13.9                5
## 10  5    Maiz   0.31      8.5        14.5                7
## 11  6    Maiz   0.35      9.1        15.2                6
## 12  8    Maiz   0.33      9.4        16.0                6

Ejercicio 5

Ordene las semillas desde la germinación más lenta hasta la más rápida.

semillas %>%
  arrange(desc(germinacion_dias))
##    id especie peso_g largo_mm humedad_pct germinacion_dias
## 1  11  Cebada   0.27      5.3         9.5                9
## 2   9  Cebada   0.28      5.5         9.8                8
## 3   5    Maiz   0.31      8.5        14.5                7
## 4  10  Cebada   0.30      5.8        10.4                7
## 5  12  Cebada   0.32      6.0        11.0                7
## 6   3   Trigo   0.39      5.9        10.8                6
## 7   6    Maiz   0.35      9.1        15.2                6
## 8   8    Maiz   0.33      9.4        16.0                6
## 9   1   Trigo   0.42      6.2        11.2                5
## 10  7    Maiz   0.38      8.8        13.9                5
## 11  2   Trigo   0.47      6.8        12.5                4
## 12  4   Trigo   0.51      7.1        13.1                4

6. mutate()

La función mutate() permite crear nuevas variables.

Sabemos que:

\[ 1 \text{ gramo} = 1000 \text{ miligramos} \]

Por tanto:

\[ peso_{mg}=peso_g \times 1000 \]

En R:

semillas %>%
  mutate(
    peso_mg = peso_g * 1000
  )
##    id especie peso_g largo_mm humedad_pct germinacion_dias peso_mg
## 1   1   Trigo   0.42      6.2        11.2                5     420
## 2   2   Trigo   0.47      6.8        12.5                4     470
## 3   3   Trigo   0.39      5.9        10.8                6     390
## 4   4   Trigo   0.51      7.1        13.1                4     510
## 5   5    Maiz   0.31      8.5        14.5                7     310
## 6   6    Maiz   0.35      9.1        15.2                6     350
## 7   7    Maiz   0.38      8.8        13.9                5     380
## 8   8    Maiz   0.33      9.4        16.0                6     330
## 9   9  Cebada   0.28      5.5         9.8                8     280
## 10 10  Cebada   0.30      5.8        10.4                7     300
## 11 11  Cebada   0.27      5.3         9.5                9     270
## 12 12  Cebada   0.32      6.0        11.0                7     320

También podemos clasificar las semillas:

semillas %>%
  mutate(
    tipo_peso = ifelse(
      peso_g >= 0.35,
      "Pesada",
      "Liviana"
    )
  )
##    id especie peso_g largo_mm humedad_pct germinacion_dias tipo_peso
## 1   1   Trigo   0.42      6.2        11.2                5    Pesada
## 2   2   Trigo   0.47      6.8        12.5                4    Pesada
## 3   3   Trigo   0.39      5.9        10.8                6    Pesada
## 4   4   Trigo   0.51      7.1        13.1                4    Pesada
## 5   5    Maiz   0.31      8.5        14.5                7   Liviana
## 6   6    Maiz   0.35      9.1        15.2                6    Pesada
## 7   7    Maiz   0.38      8.8        13.9                5    Pesada
## 8   8    Maiz   0.33      9.4        16.0                6   Liviana
## 9   9  Cebada   0.28      5.5         9.8                8   Liviana
## 10 10  Cebada   0.30      5.8        10.4                7   Liviana
## 11 11  Cebada   0.27      5.3         9.5                9   Liviana
## 12 12  Cebada   0.32      6.0        11.0                7   Liviana

Ejercicio 6

Cree una nueva variable llamada largo_cm.

Recuerde:

\[ 1 \text{ cm}=10 \text{ mm} \]

semillas %>%
  mutate(
    largo_cm = largo_mm / 10
  )
##    id especie peso_g largo_mm humedad_pct germinacion_dias largo_cm
## 1   1   Trigo   0.42      6.2        11.2                5     0.62
## 2   2   Trigo   0.47      6.8        12.5                4     0.68
## 3   3   Trigo   0.39      5.9        10.8                6     0.59
## 4   4   Trigo   0.51      7.1        13.1                4     0.71
## 5   5    Maiz   0.31      8.5        14.5                7     0.85
## 6   6    Maiz   0.35      9.1        15.2                6     0.91
## 7   7    Maiz   0.38      8.8        13.9                5     0.88
## 8   8    Maiz   0.33      9.4        16.0                6     0.94
## 9   9  Cebada   0.28      5.5         9.8                8     0.55
## 10 10  Cebada   0.30      5.8        10.4                7     0.58
## 11 11  Cebada   0.27      5.3         9.5                9     0.53
## 12 12  Cebada   0.32      6.0        11.0                7     0.60

7. summarise()

La función summarise() permite obtener estadísticas resumen.

Peso promedio:

semillas %>%
  summarise(
    peso_promedio = mean(peso_g)
  )
##   peso_promedio
## 1     0.3608333

Podemos calcular varias estadísticas:

semillas %>%
  summarise(
    peso_promedio = mean(peso_g),
    peso_minimo = min(peso_g),
    peso_maximo = max(peso_g),
    desviacion_peso = sd(peso_g)
  )
##   peso_promedio peso_minimo peso_maximo desviacion_peso
## 1     0.3608333        0.27        0.51      0.07549333

Ejercicio 7

Calcule:

  • humedad promedio;
  • germinación promedio;
  • número total de semillas.
semillas %>%
  summarise(
    humedad_promedio = mean(humedad_pct),
    germinacion_promedio = mean(germinacion_dias),
    numero_semillas = n()
  )
##   humedad_promedio germinacion_promedio numero_semillas
## 1           12.325             6.166667              12

8. Combinar funciones

La principal ventaja de dplyr es combinar varias operaciones.

Queremos:

  1. seleccionar semillas con peso mayor que 0.30 gramos;
  2. conservar solamente algunas variables;
  3. ordenar desde mayor a menor peso.
semillas %>%
  filter(peso_g > 0.30) %>%
  select(especie, peso_g, germinacion_dias) %>%
  arrange(desc(peso_g))
##   especie peso_g germinacion_dias
## 1   Trigo   0.51                4
## 2   Trigo   0.47                4
## 3   Trigo   0.42                5
## 4   Trigo   0.39                6
## 5    Maiz   0.38                5
## 6    Maiz   0.35                6
## 7    Maiz   0.33                6
## 8  Cebada   0.32                7
## 9    Maiz   0.31                7

La secuencia puede leerse así:

\[ \text{semillas} \rightarrow \text{filtrar} \rightarrow \text{seleccionar} \rightarrow \text{ordenar} \]


9. Ejercicio integrador

Construya una nueva tabla que:

  1. incluya solamente semillas con humedad superior a 10%;
  2. conserve especie, peso_g, humedad_pct y germinacion_dias;
  3. cree una nueva variable llamada peso_mg;
  4. ordene desde mayor a menor peso.

Complete:

resultado <- semillas %>%
  filter(__________________) %>%
  select(__________________) %>%
  mutate(__________________) %>%
  arrange(__________________)

10. Solución

resultado <- semillas %>%
  filter(humedad_pct > 10) %>%
  select(especie, peso_g, humedad_pct, germinacion_dias) %>%
  mutate(peso_mg = peso_g * 1000) %>%
  arrange(desc(peso_g))

resultado
##    especie peso_g humedad_pct germinacion_dias peso_mg
## 1    Trigo   0.51        13.1                4     510
## 2    Trigo   0.47        12.5                4     470
## 3    Trigo   0.42        11.2                5     420
## 4    Trigo   0.39        10.8                6     390
## 5     Maiz   0.38        13.9                5     380
## 6     Maiz   0.35        15.2                6     350
## 7     Maiz   0.33        16.0                6     330
## 8   Cebada   0.32        11.0                7     320
## 9     Maiz   0.31        14.5                7     310
## 10  Cebada   0.30        10.4                7     300

Resumen

Función Utilidad
select() seleccionar columnas
filter() seleccionar filas
arrange() ordenar observaciones
mutate() crear o transformar variables
summarise() obtener estadísticas resumen

La estructura básica de trabajo con dplyr es:

base %>%
  filter(...) %>%
  select(...) %>%
  mutate(...) %>%
  arrange(...)

Conceptualmente:

\[ \boxed{ \text{Base original} \rightarrow \text{transformaciones} \rightarrow \text{resultado} } \] ````