Tarea Joins, tidy data y relacion entre tablas

Author

Keyra Wagner

#Librerias
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Tabla 1: Clientes
clientes <- tibble(
  id_cliente = c("C001", "C002", "C003", "C004", "C005", "C006"),
  nombre     = c("Ana Torres", "Pedro Méndez", "María López", "Luis García", "Carmen Díaz", "Jorge Reyes"),
  ciudad     = c("Santo Domingo", "Santiago", "Santo Domingo", "La Vega", "San Pedro", "Santo Domingo"),
  tipo       = c("Premium", "Regular", "Premium", "Regular", "Regular", "Premium")
)

# Tabla 2: Facturas
facturas <- tibble(
  id_factura = c("F001", "F002", "F003", "F004", "F005", "F006", "F007", "F008"),
  id_cliente = c("C001", "C001", "C002", "C003", "C005", "C007", "C002", "C001"),
  mes        = c("Ene", "Feb", "Ene", "Feb", "Ene", "Feb", "Mar", "Ene"),
  monto      = c(15000, 22000, 8500, 31000, 4500, 12000, 9800, 15000)
)

# Tabla 3: Pagos
pagos <- tibble(
  id_factura   = c("F001", "F002", "F004", "F006", "F007"),
  monto_pagado = c(15000, 22000, 31000, 12000, 9800)
)

#Facturas sin clientes existentes

anti_join(facturas, clientes, by = "id_cliente")
# A tibble: 1 × 4
  id_factura id_cliente mes   monto
  <chr>      <chr>      <chr> <dbl>
1 F006       C007       Feb   12000
# La factura F006 pertenece al cliente C007,
# pero ese cliente no existe en la tabla clientes.

#Clientes sin facturas

clientes_sin_factura <- anti_join(clientes, facturas, by = "id_cliente")

clientes_sin_factura
# A tibble: 2 × 4
  id_cliente nombre      ciudad        tipo   
  <chr>      <chr>       <chr>         <chr>  
1 C004       Luis García La Vega       Regular
2 C006       Jorge Reyes Santo Domingo Premium
nrow(clientes_sin_factura)
[1] 2
#Hay 2 clientes sin facturas

#Facturas sin pago

facturas_sin_pago <- anti_join(facturas, pagos, by = "id_factura")

facturas_sin_pago
# A tibble: 3 × 4
  id_factura id_cliente mes   monto
  <chr>      <chr>      <chr> <dbl>
1 F003       C002       Ene    8500
2 F005       C005       Ene    4500
3 F008       C001       Ene   15000
#Las facturas F003,F005 Y F008 no se han pagado.

#Duplicados

facturas |>
  count(id_cliente, id_factura, mes, monto) |>
  filter(n > 1)
# A tibble: 0 × 5
# ℹ 5 variables: id_cliente <chr>, id_factura <chr>, mes <chr>, monto <dbl>,
#   n <int>
#Ningún id_cliente tiene facturas duplicadas exactas.
# C001 aparece varias veces porque posee varias facturas distintas.

#PARTE 2

#LEFT JOIN

nrow(clientes)
[1] 6
clientes_con_facturas <- clientes |>
  left_join(facturas, by = "id_cliente")

nrow(clientes_con_facturas)
[1] 9
# El resultado tiene más filas porque algunos clientes
# poseen varias facturas.

#INNER JOIN

clientes_facturas_inner <- clientes |>
  inner_join(facturas, by = "id_cliente")

clientes_facturas_inner
# A tibble: 7 × 7
  id_cliente nombre       ciudad        tipo    id_factura mes   monto
  <chr>      <chr>        <chr>         <chr>   <chr>      <chr> <dbl>
1 C001       Ana Torres   Santo Domingo Premium F001       Ene   15000
2 C001       Ana Torres   Santo Domingo Premium F002       Feb   22000
3 C001       Ana Torres   Santo Domingo Premium F008       Ene   15000
4 C002       Pedro Méndez Santiago      Regular F003       Ene    8500
5 C002       Pedro Méndez Santiago      Regular F007       Mar    9800
6 C003       María López  Santo Domingo Premium F004       Feb   31000
7 C005       Carmen Díaz  San Pedro     Regular F005       Ene    4500
# Los clientes sin facturas no aparecen

#FULL JOIN

clientes_facturas_full <- clientes |>
  full_join(facturas, by = "id_cliente")

clientes_facturas_full
# A tibble: 10 × 7
   id_cliente nombre       ciudad        tipo    id_factura mes   monto
   <chr>      <chr>        <chr>         <chr>   <chr>      <chr> <dbl>
 1 C001       Ana Torres   Santo Domingo Premium F001       Ene   15000
 2 C001       Ana Torres   Santo Domingo Premium F002       Feb   22000
 3 C001       Ana Torres   Santo Domingo Premium F008       Ene   15000
 4 C002       Pedro Méndez Santiago      Regular F003       Ene    8500
 5 C002       Pedro Méndez Santiago      Regular F007       Mar    9800
 6 C003       María López  Santo Domingo Premium F004       Feb   31000
 7 C004       Luis García  La Vega       Regular <NA>       <NA>     NA
 8 C005       Carmen Díaz  San Pedro     Regular F005       Ene    4500
 9 C006       Jorge Reyes  Santo Domingo Premium <NA>       <NA>     NA
10 C007       <NA>         <NA>          <NA>    F006       Feb   12000
# full_join conserva todos los registros
# de ambas tablas aunque no tengan coincidencia.

#Tablas

tabla_maestra <- clientes |>
  left_join(facturas, by = "id_cliente") |>
  left_join(pagos, by = "id_factura")

print(tabla_maestra)
# A tibble: 9 × 8
  id_cliente nombre       ciudad       tipo  id_factura mes   monto monto_pagado
  <chr>      <chr>        <chr>        <chr> <chr>      <chr> <dbl>        <dbl>
1 C001       Ana Torres   Santo Domin… Prem… F001       Ene   15000        15000
2 C001       Ana Torres   Santo Domin… Prem… F002       Feb   22000        22000
3 C001       Ana Torres   Santo Domin… Prem… F008       Ene   15000           NA
4 C002       Pedro Méndez Santiago     Regu… F003       Ene    8500           NA
5 C002       Pedro Méndez Santiago     Regu… F007       Mar    9800         9800
6 C003       María López  Santo Domin… Prem… F004       Feb   31000        31000
7 C004       Luis García  La Vega      Regu… <NA>       <NA>     NA           NA
8 C005       Carmen Díaz  San Pedro    Regu… F005       Ene    4500           NA
9 C006       Jorge Reyes  Santo Domin… Prem… <NA>       <NA>     NA           NA
#Pregunta
#¿Por qué algunos monto pagado son NA?

#Porque esas facturas no aparecen en la tabla pagos.

#PARTE 3

#Clientes cin factura

clientes_con_factura <- semi_join(
  clientes,
  facturas,
  by = "id_cliente"
)

clientes_con_factura
# A tibble: 4 × 4
  id_cliente nombre       ciudad        tipo   
  <chr>      <chr>        <chr>         <chr>  
1 C001       Ana Torres   Santo Domingo Premium
2 C002       Pedro Méndez Santiago      Regular
3 C003       María López  Santo Domingo Premium
4 C005       Carmen Díaz  San Pedro     Regular
nrow(clientes_con_factura)
[1] 4

#Clientes que nunca facturaron

anti_join(clientes, facturas, by = "id_cliente") |>
  select(nombre, ciudad)
# A tibble: 2 × 2
  nombre      ciudad       
  <chr>       <chr>        
1 Luis García La Vega      
2 Jorge Reyes Santo Domingo

#Facturas de clientes que no estan registrados

anti_join(facturas, clientes, by = "id_cliente") |>
  select(id_factura, id_cliente, monto)
# A tibble: 1 × 3
  id_factura id_cliente monto
  <chr>      <chr>      <dbl>
1 F006       C007       12000

#PARTE 4

#Quitar duplicados

facturas_sin_dup <- facturas |>
  distinct()

nrow(facturas_sin_dup)
[1] 8

#Mayor monto por cliente

facturas_max <- facturas |>
  group_by(id_cliente) |>
  slice_max(order_by = monto, n = 1) |>
  ungroup()

#Nueva tabla

tabla_maestra2 <- clientes |>
  left_join(facturas_sin_dup, by = "id_cliente") |>
  left_join(pagos, by = "id_factura")
nrow(tabla_maestra)
[1] 9
nrow(tabla_maestra2)
[1] 9

#PARTE 5

ventas_por_mes <- tabla_maestra2 |>
  filter(!is.na(mes)) |>
  group_by(nombre, mes) |>
  summarise(
    total = sum(monto, na.rm = TRUE),
    .groups = "drop"
  ) |>
  pivot_wider(
    names_from = mes,
    values_from = total,
    values_fill = 0
  )

ventas_por_mes
# A tibble: 4 × 4
  nombre         Ene   Feb   Mar
  <chr>        <dbl> <dbl> <dbl>
1 Ana Torres   30000 22000     0
2 Carmen Díaz   4500     0     0
3 María López      0 31000     0
4 Pedro Méndez  8500     0  9800
ventas_largo <- ventas_por_mes |>
  pivot_longer(
    cols = -nombre,
    names_to = "mes",
    values_to = "total"
  )

ventas_largo
# A tibble: 12 × 3
   nombre       mes   total
   <chr>        <chr> <dbl>
 1 Ana Torres   Ene   30000
 2 Ana Torres   Feb   22000
 3 Ana Torres   Mar       0
 4 Carmen Díaz  Ene    4500
 5 Carmen Díaz  Feb       0
 6 Carmen Díaz  Mar       0
 7 María López  Ene       0
 8 María López  Feb   31000
 9 María López  Mar       0
10 Pedro Méndez Ene    8500
11 Pedro Méndez Feb       0
12 Pedro Méndez Mar    9800

#Total vendido por mes

ventas_largo |>
  group_by(mes) |>
  summarise(
    total_mes = sum(total)
  ) |>
  arrange(desc(total_mes))
# A tibble: 3 × 2
  mes   total_mes
  <chr>     <dbl>
1 Feb       53000
2 Ene       43000
3 Mar        9800