Unir tablas en R: conciliar facturas y pagos

Unir tablas es como hacer un BUSCARX, pero con toda la tabla. Este ejemplo usa datos ficticios: facturas.csv y pagos.csv.

Los datos

library(tidyverse)
facturas <- read_csv("https://grafoso.com/r/facturas.csv", show_col_types = FALSE)
pagos <- read_csv("https://grafoso.com/r/pagos.csv", show_col_types = FALSE)

Facturas con su pago

left_join() conserva todas las facturas. Las que no tienen pago quedan vacías, y replace_na() las pone en cero.

conciliacion <- facturas |>
  left_join(pagos, by = "folio") |>
  mutate(
    monto = replace_na(monto, 0),
    saldo = total - monto
  )
conciliacion |>
  select(folio, cliente, total, monto, saldo)
# A tibble: 6 × 5
  folio cliente          total monto saldo
  <chr> <chr>            <dbl> <dbl> <dbl>
1 F-101 Abarrotes Luna   11600 11600     0
2 F-102 Papelería Sol     5800  5800     0
3 F-103 Taller Río        2320  1000  1320
4 F-104 Farmacia Mar      8700     0  8700
5 F-105 Ferretería Cielo  4640  4640     0
6 F-106 Panadería Sur     1740     0  1740

Qué falta por cobrar

conciliacion |>
  filter(saldo > 0) |>
  select(folio, cliente, saldo)
# A tibble: 3 × 3
  folio cliente       saldo
  <chr> <chr>         <dbl>
1 F-103 Taller Río     1320
2 F-104 Farmacia Mar   8700
3 F-106 Panadería Sur  1740

Pagos sin factura

anti_join() muestra lo que no tiene coincidencia.

pagos |>
  anti_join(facturas, by = "folio")
# A tibble: 1 × 3
  folio fecha_pago monto
  <chr> <date>     <dbl>
1 F-999 2026-03-25   500

Si una factura tiene varios pagos

Cada factura se repetiría por cada pago y el saldo saldría mal. Suma antes los pagos por folio:

pagos_por_folio <- pagos |>
  group_by(folio) |>
  summarise(monto = sum(monto))

Y une esa tabla. Con folios fiscales, usa el UUID como llave.

Preguntas frecuentes

¿Cuál es la diferencia con inner_join?

left_join conserva todas las filas de la primera tabla; inner_join, solo las que coinciden en ambas.

¿Y si la columna se llama distinto?

Indícalo así: by = c("folio" = "factura"), donde a la izquierda va el nombre de la primera tabla.

Fuentes oficiales