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 1740Qué 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 1740Pagos 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 500Si 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.