dplyrEn 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.
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
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
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} \]
Seleccione solamente:
idespeciegerminacion_diassemillas %>%
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
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
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
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
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
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
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
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
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
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
Calcule:
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
La principal ventaja de dplyr es combinar varias
operaciones.
Queremos:
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} \]
Construya una nueva tabla que:
especie, peso_g,
humedad_pct y germinacion_dias;peso_mg;Complete:
resultado <- semillas %>%
filter(__________________) %>%
select(__________________) %>%
mutate(__________________) %>%
arrange(__________________)
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
| 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} } \] ````