La idea de esta presnetcaión es mostrar algunas de las bondades de
las funciones *_join y cómo asociarlas con las otras
funciones que fuimos viendo. Para eso primero vamos a cargar los
paquetes necesarios y crear tres planillas de datos a modo de
ejemplo.
library(tidyr)
library(dplyr)
datos_barcos <- data.frame(barco = c("Angelescu", "Mar Argentino", "Holmberg"),
id = c("aq", "ma (remix)", "jo"),
eslora = c(12.5, 15.2, 17.1),
esgaviota = c(5.1, 6.1, 8.8))
datos_zonas <- data.frame(id = rep(c("aq", "ma (remix)", "jo"), 2),
fecha = rep(2020:2021, each = 3),
zona = c("Atacama", "Mendoza", "Salta", "Mar", "Otro mar", "Agua"))
datos_lances <- data.frame(id = rep(c("aq", "ma (remix)", "jo"), each = 10),
fecha = rep(2020:2021, each = 5),
lance = rep(1:10, 3),
peso_bicho_1 = rnorm(30, mean = 10, sd = 2),
peso_bicho_2 = runif(30, 0, 200))
Veamos de qué tratan estas planillas
datos_barcos
## barco id eslora esgaviota
## 1 Angelescu aq 12.5 5.1
## 2 Mar Argentino ma (remix) 15.2 6.1
## 3 Holmberg jo 17.1 8.8
datos_zonas
## id fecha zona
## 1 aq 2020 Atacama
## 2 ma (remix) 2020 Mendoza
## 3 jo 2020 Salta
## 4 aq 2021 Mar
## 5 ma (remix) 2021 Otro mar
## 6 jo 2021 Agua
str(datos_lances)
## 'data.frame': 30 obs. of 5 variables:
## $ id : chr "aq" "aq" "aq" "aq" ...
## $ fecha : int 2020 2020 2020 2020 2020 2021 2021 2021 2021 2021 ...
## $ lance : int 1 2 3 4 5 6 7 8 9 10 ...
## $ peso_bicho_1: num 6.78 14.8 10.12 9.6 11.38 ...
## $ peso_bicho_2: num 115.8 71 150.3 69.2 137.8 ...
Supongamos que queremos saber el peso total de la captura por zona de pesca y año lo primero que hay que hacer es unir las planillas de zonas y lances
datos_zonas %>%
left_join(datos_lances)
## Joining with `by = join_by(id, fecha)`
## id fecha zona lance peso_bicho_1 peso_bicho_2
## 1 aq 2020 Atacama 1 6.783397 115.81656
## 2 aq 2020 Atacama 2 14.804040 71.00180
## 3 aq 2020 Atacama 3 10.121093 150.27597
## 4 aq 2020 Atacama 4 9.595875 69.16875
## 5 aq 2020 Atacama 5 11.382570 137.77477
## 6 ma (remix) 2020 Mendoza 1 9.038314 11.57425
## 7 ma (remix) 2020 Mendoza 2 8.716042 184.73436
## 8 ma (remix) 2020 Mendoza 3 11.229860 49.31108
## 9 ma (remix) 2020 Mendoza 4 5.621291 107.82109
## 10 ma (remix) 2020 Mendoza 5 11.422426 96.11369
## 11 jo 2020 Salta 1 10.491708 94.02218
## 12 jo 2020 Salta 2 11.870939 59.97539
## 13 jo 2020 Salta 3 9.840300 78.55433
## 14 jo 2020 Salta 4 10.195596 92.87365
## 15 jo 2020 Salta 5 6.600590 111.17163
## 16 aq 2021 Mar 6 12.455999 112.04919
## 17 aq 2021 Mar 7 9.231532 107.80617
## 18 aq 2021 Mar 8 9.890225 37.07800
## 19 aq 2021 Mar 9 12.672247 121.76289
## 20 aq 2021 Mar 10 10.520511 99.36127
## 21 ma (remix) 2021 Otro mar 6 11.592734 69.87955
## 22 ma (remix) 2021 Otro mar 7 11.136519 55.62677
## 23 ma (remix) 2021 Otro mar 8 10.926832 78.31320
## 24 ma (remix) 2021 Otro mar 9 11.450832 156.88109
## 25 ma (remix) 2021 Otro mar 10 13.614410 162.50380
## 26 jo 2021 Agua 6 9.196833 168.67392
## 27 jo 2021 Agua 7 10.197457 10.56395
## 28 jo 2021 Agua 8 10.649699 47.80125
## 29 jo 2021 Agua 9 8.758272 168.59424
## 30 jo 2021 Agua 10 11.004099 144.50435
Funciona como queremos, ahora sigamos Calculemos la suma de los pesos por lance como nos dijo Kechu
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2)
## Joining with `by = join_by(id, fecha)`
## id fecha zona lance peso_bicho_1 peso_bicho_2 peso_total
## 1 aq 2020 Atacama 1 6.783397 115.81656 122.59995
## 2 aq 2020 Atacama 2 14.804040 71.00180 85.80584
## 3 aq 2020 Atacama 3 10.121093 150.27597 160.39707
## 4 aq 2020 Atacama 4 9.595875 69.16875 78.76463
## 5 aq 2020 Atacama 5 11.382570 137.77477 149.15734
## 6 ma (remix) 2020 Mendoza 1 9.038314 11.57425 20.61256
## 7 ma (remix) 2020 Mendoza 2 8.716042 184.73436 193.45040
## 8 ma (remix) 2020 Mendoza 3 11.229860 49.31108 60.54094
## 9 ma (remix) 2020 Mendoza 4 5.621291 107.82109 113.44239
## 10 ma (remix) 2020 Mendoza 5 11.422426 96.11369 107.53611
## 11 jo 2020 Salta 1 10.491708 94.02218 104.51389
## 12 jo 2020 Salta 2 11.870939 59.97539 71.84633
## 13 jo 2020 Salta 3 9.840300 78.55433 88.39463
## 14 jo 2020 Salta 4 10.195596 92.87365 103.06924
## 15 jo 2020 Salta 5 6.600590 111.17163 117.77222
## 16 aq 2021 Mar 6 12.455999 112.04919 124.50519
## 17 aq 2021 Mar 7 9.231532 107.80617 117.03771
## 18 aq 2021 Mar 8 9.890225 37.07800 46.96823
## 19 aq 2021 Mar 9 12.672247 121.76289 134.43513
## 20 aq 2021 Mar 10 10.520511 99.36127 109.88179
## 21 ma (remix) 2021 Otro mar 6 11.592734 69.87955 81.47229
## 22 ma (remix) 2021 Otro mar 7 11.136519 55.62677 66.76329
## 23 ma (remix) 2021 Otro mar 8 10.926832 78.31320 89.24003
## 24 ma (remix) 2021 Otro mar 9 11.450832 156.88109 168.33192
## 25 ma (remix) 2021 Otro mar 10 13.614410 162.50380 176.11821
## 26 jo 2021 Agua 6 9.196833 168.67392 177.87075
## 27 jo 2021 Agua 7 10.197457 10.56395 20.76140
## 28 jo 2021 Agua 8 10.649699 47.80125 58.45095
## 29 jo 2021 Agua 9 8.758272 168.59424 177.35251
## 30 jo 2021 Agua 10 11.004099 144.50435 155.50845
Vamos bien, ahora nos queda agrupar por zona y calcular la suma total
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2) %>%
group_by(zona) %>%
summarise(total = sum(peso_total))
## Joining with `by = join_by(id, fecha)`
## # A tibble: 6 × 2
## zona total
## <chr> <dbl>
## 1 Agua 590.
## 2 Atacama 597.
## 3 Mar 533.
## 4 Mendoza 496.
## 5 Otro mar 582.
## 6 Salta 486.
Supongamos ahora que queremos evaluar si la captura total está relacionada con la eslora, para eso necesitamos los datos de antes pero con la información del barco del que provinieron los datos
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2) %>%
group_by(zona, id) %>%
summarise(total = sum(peso_total))
## Joining with `by = join_by(id, fecha)`
## `summarise()` has grouped output by 'zona'. You can override using the
## `.groups` argument.
## # A tibble: 6 × 3
## # Groups: zona [6]
## zona id total
## <chr> <chr> <dbl>
## 1 Agua jo 590.
## 2 Atacama aq 597.
## 3 Mar aq 533.
## 4 Mendoza ma (remix) 496.
## 5 Otro mar ma (remix) 582.
## 6 Salta jo 486.
Ya teniendo eso podemos unir con la planilla de barcos
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2) %>%
group_by(zona, id) %>%
summarise(total = sum(peso_total)) %>%
left_join(datos_barcos)
## Joining with `by = join_by(id, fecha)`
## `summarise()` has grouped output by 'zona'. You can override using the
## `.groups` argument.
## Joining with `by = join_by(id)`
## # A tibble: 6 × 6
## # Groups: zona [6]
## zona id total barco eslora esgaviota
## <chr> <chr> <dbl> <chr> <dbl> <dbl>
## 1 Agua jo 590. Holmberg 17.1 8.8
## 2 Atacama aq 597. Angelescu 12.5 5.1
## 3 Mar aq 533. Angelescu 12.5 5.1
## 4 Mendoza ma (remix) 496. Mar Argentino 15.2 6.1
## 5 Otro mar ma (remix) 582. Mar Argentino 15.2 6.1
## 6 Salta jo 486. Holmberg 17.1 8.8
La planilla ya estaría lista para hacer los análisis pero si quisiéramos hacer una tabla con esto, hay columnas que no nos sirven
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2) %>%
group_by(zona, id) %>%
summarise(total = sum(peso_total)) %>%
left_join(datos_barcos) %>%
select(barco, zona, eslora, total)
## Joining with `by = join_by(id, fecha)`
## `summarise()` has grouped output by 'zona'. You can override using the
## `.groups` argument.
## Joining with `by = join_by(id)`
## # A tibble: 6 × 4
## # Groups: zona [6]
## barco zona eslora total
## <chr> <chr> <dbl> <dbl>
## 1 Holmberg Agua 17.1 590.
## 2 Angelescu Atacama 12.5 597.
## 3 Angelescu Mar 12.5 533.
## 4 Mar Argentino Mendoza 15.2 496.
## 5 Mar Argentino Otro mar 15.2 582.
## 6 Holmberg Salta 17.1 486.
Para que quede prolijo lo podemos ordenar por barco
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2) %>%
group_by(zona, id) %>%
summarise(total = sum(peso_total)) %>%
left_join(datos_barcos) %>%
select(barco, zona, eslora, total) %>%
arrange(barco)
## Joining with `by = join_by(id, fecha)`
## `summarise()` has grouped output by 'zona'. You can override using the
## `.groups` argument.
## Joining with `by = join_by(id)`
## # A tibble: 6 × 4
## # Groups: zona [6]
## barco zona eslora total
## <chr> <chr> <dbl> <dbl>
## 1 Angelescu Atacama 12.5 597.
## 2 Angelescu Mar 12.5 533.
## 3 Holmberg Agua 17.1 590.
## 4 Holmberg Salta 17.1 486.
## 5 Mar Argentino Mendoza 15.2 496.
## 6 Mar Argentino Otro mar 15.2 582.
El problema es que a último momento nos avisan que los datos de Atacama, Salta y Mendoza no serían confiables
datos_zonas %>%
left_join(datos_lances) %>%
mutate(peso_total = peso_bicho_1 + peso_bicho_2) %>%
group_by(zona, id) %>%
summarise(total = sum(peso_total)) %>%
left_join(datos_barcos) %>%
select(barco, zona, eslora, total) %>%
arrange(barco) %>%
filter(zona %in% c("Mar", "Otro mar", "Agua"))
## Joining with `by = join_by(id, fecha)`
## `summarise()` has grouped output by 'zona'. You can override using the
## `.groups` argument.
## Joining with `by = join_by(id)`
## # A tibble: 3 × 4
## # Groups: zona [3]
## barco zona eslora total
## <chr> <chr> <dbl> <dbl>
## 1 Angelescu Mar 12.5 533.
## 2 Holmberg Agua 17.1 590.
## 3 Mar Argentino Otro mar 15.2 582.
Gracias Kechu, nos ahorraste horas de Excel