Limpieza y validación de RUT en R
Funciones de R para limpiar, validar y verificar el número de cédula de identidad Chilena
12/6/2026
En Chile, los
RUT son los números de identificación usados para ciudadanos y empresas. Tienen el formato xxxxxxx-y, donde x es el número o cuerpo, e y es el dígito verificador (número entre 0 y 9 o K). En esta publicación entrego algunas funciones para realizar operaciones comunes con los RUT en R, como validarlos, calcular el dígito verificador, y limpiar los RUT.
Calcular dígito verificador
El dígito verificador del RUT permite confirmar que se escribió correctamente usando el algoritmo módulo 11. En resumen, este algoritmo:
- Toma los dígitos previos al guión
- Multiplica cada dígito, de derecha a izquierda, por la secuencia cíclica
2, 3, 4, 5, 6, 7y suma los resultados - A esta suma se le calcula el módulo (resto de la división entera) de 11, y el resultado se le resta a 11
- El resultado de lo anterior es el dígito verificador; pero si el resultado es
11o10, el dígito será0oK, respectivamente
La siguiente función de R implementa el cálculo del código verificador de cualquier RUT sin código verificador:
#' Calcular dígito verificador del RUT
#'
#' Calcula el dígito verificador para un RUT sin dígito verificador. Puede recibir uno o varios RUTs.
#'
#' @returns Dígito verificador del cuerpo del RUT entregrado, en tipo caracter
#'
#' @param rut_sin_digito Vector de RUTs sin dígito verificador
#'
#' @example `calcular_digito(11111111)`
#'
calcular_digito <- function(rut_sin_digito) {
require(stringr)
require(purrr)
# separar números en dígitos
digitos_lista <- strsplit(as.character(rut_sin_digito), "")
# calcular dígito verificador
digito <- map(
digitos_lista,
\(digitos) {
digitos <- as.numeric(digitos)
# secuencia cíclica de 2 a 7
pesos <- rep(2:7, length.out = length(digitos))
# sumar pesos invertidos con los dígitos
suma <- sum(digitos * rev(pesos))
# restar número 11 con el módulo 11 de la suma
digito <- 11 - (suma %% 11)
return(
as.character(digito)
)
})
digito <- list_c(digito)
# casos especiales
digito <- ifelse(digito == "11", "0", digito)
digito <- ifelse(digito == "10", "K", digito)
return(digito)
}
Probemos la función con algunos RUT de prueba:
calcular_digito(24324110)
Loading required package: stringr
Loading required package: purrr
[1] "3"
calcular_digito(
c(11111111,
1111111,
8519622)
)
[1] "1" "4" "7"
Validar un RUT
Otra cosa que podemos necesitar hacer con los RUT es verificar si vienen en un formato determinado. En este caso, el formato apropiado será xxxxxxxx-y, y esta función verificará: que el RUT contiene un guión, que se sigue el formato xxxxxxxx-y, y que el dígito verificador que trae sea el correcto (usando la función calcular_digito()):
#' Validar formato de un RUT
#'
#' Aplica varias pruebas para confirmar que un RUT es válido.
#'
#' Para confirmar que un RUT es válido, detecta que contenga un guión, verifica el formato "xxx-x", y valida que el dígito verificador sea correcto. Esta función acepta uno o varios RUTs.
#'
#' @returns TRUE/FALSE
#'
#' @param rut Vector de RUTs a consultar
#'
#' @example `validar_rut("11111111-1")`
#'
validar_rut <- function(rut) {
require(stringr)
require(cli)
require(purrr)
# por cada RUT:
validacion <- map(
rut,
\(rut) {
# rut <- "18172852-3"
rut <- as.character(rut)
rut <- toupper(rut)
# confirmar guión
confirmar_guion <- str_detect(rut, "-")
if (!confirmar_guion) {
cli_alert_warning("RUT {rut} no incluye guión")
return(FALSE)
}
# verificar formato esperado
confirmar_formato <- str_detect(rut, "^[0-9]+-[0-9K]$")
if (!confirmar_formato) {
cli_alert_warning("RUT {rut} con formato incorrecto")
return(FALSE)
}
# validar dígito verificador
digito_verificador <- str_extract(rut, "[0-9K]$")
rut_sin_digito <- str_remove_all(rut, "\\-[0-9K]$")
confirmar_digito <- calcular_digito(rut_sin_digito) == digito_verificador
if (!confirmar_digito) {
cli_alert_warning("RUT {rut} con dígito verificador incorrecto")
return(FALSE)
}
return(TRUE)
})
return(
unlist(validacion)
)
}
Probemos la función validar_rut() con algunos RUTs de prueba:
validar_rut("17505116-3")
Loading required package: cli
[1] TRUE
validar_rut("23376940-1")
[1] TRUE
validar_rut(c("23376940-1", "24444145-9"))
[1] TRUE TRUE
validar_rut("11111111")
! RUT 11111111 no incluye guión
[1] FALSE
validar_rut(c("hola", "11111111", "19413730-3"))
! RUT HOLA no incluye guión
! RUT 11111111 no incluye guión
[1] FALSE FALSE TRUE
Limpiar RUT
Por mientras hago la función:
library(stringr)
rut <- "24.444.145-9"
# eliminar puntos
str_remove_all(rut, "\\.")
[1] "24444145-9"
# eliminar guiones
str_remove_all(rut, "-")
[1] "24.444.1459"
# extraer sólo números
str_extract_all(rut, "\\d+", simplify = TRUE) |>
paste(collapse = "")
[1] "244441459"
Paquete de R
Otros
Publicaciones sobre Chile