# Validar datos para prevenir problemas y errores futuros

_Estrategia simple para ir revisando los datos constantemente en tus pipelines de procesamiento de datos_

> ¿Alguna vez has tenido dudas sobre los datos que estás explorando? En pipelines extensos, puede ser imposible tener certeza de que los datos son como esperamos, o necesitamos confirmar que los datos tienen ciertas características luego de filtrarlos, cruzarlos, o transformarlos. La validación resuelve esto!

- URL: https://bastianolea.rbind.io/blog/2026-08-21/
- Fecha: 2026-08-28
- Autor: Bastián Olea Herrera
- Etiquetas: consejos, limpieza de datos
- Recursos: [pointblank](https://rstudio.github.io/pointblank/index.html) [Tutorial](https://bastianolea.rbind.io/blog/validacion_datos/)

---

¿Alguna vez has tenido dudas sobre los datos que estás explorando?

Últimamente he estado trabajando con *pipelines* o flujos de procesamiento de datos extensos, y en cierto momento es imposible tener certeza de que los datos son como esperamos. También pasa que queremos confirmar que los datos tienen ciertas características luego de filtrarlos, cruzarlos, o transformarlos.

Con el paquete `{pointblank}` puedes olvidarte de las inseguridades cuando trabajes con datos!

Por ejemplo, veamos estos datos de prueba:

``` r
library(dplyr)

datos <- tibble(
  nombre = c("a", "b", "c", "d", "e"),
  valor  = c("13", "24", "12", "nada", "78")
)

datos
```

    # A tibble: 5 × 2
      nombre valor
      <chr>  <chr>
    1 a      13   
    2 b      24   
    3 c      12   
    4 d      nada 
    5 e      78   

Tenemos dos variables, ambas de tipo caracter/texto.

Normalmente, si queremos confirmar si existen datos perdidos (`NA`s), haríamos algo como:

``` r
library(dplyr)

perdidos <- datos |> 
  filter(is.na(valor))
  
cli::cli_inform("Existen {nrow(perdidos)} datos perdidos")
```

> Existen 0 datos perdidos

Si bien esto sirve, hay mejores formas de hacerlo en R!

**Publicación relacionada:** [Validación básica de datos con R](https://bastianolea.rbind.io/blog/validacion_basica/index.md): Si estás procesando muchos datos y/o datos que vienen de distintas fuentes con R, validarlos puede ayudarte a encontrar problemas antes de que sea tarde! ¿Qué es la validación de datos? Son las…

Con el conjunto de funciones `expect_x()` de `{pointblank}`, definimos lo que *esperamos* de la tabla de datos:

``` r
library(pointblank)

# esperar que no hayan datos perdidos en la columna
datos |> 
  expect_col_vals_not_null(valor)
```

La función `expect_col_vals_not_null()`, como su nombre indica, espera (*expect*) que los valores de una columna no sean inválidos.

En vez de preguntar cuántos datos perdidos hay, y hacer la revisión al ojímetro, decimos: *esperamos* que no hayan datos perdidos en la columna. Si la expectativa se cumple, todo bien y tu *pipeline* sigue corriendo! Pero si hubiera un problema con la expectativa, el cálculo se detiene para que puedas corregirlo.

Entonces: la idea es ir agregando **pruebas** a lo largo de tu pipeline, para ir **confirmando las expectativas** de la calidad de los datos, y avisarte mediante un **error** cuando las expectativas no se cumplan.

![](https://bastianolea.rbind.io/blog/2026-08-21/featured_pointblank.png)

Hagamos un cambio *inocente* a los datos: convertir una columna a tipo numérico:

``` r
datos <- datos |> 
  mutate(valor = as.numeric(valor))
```

    Warning: There was 1 warning in `mutate()`.
    ℹ In argument: `valor = as.numeric(valor)`.
    Caused by warning:
    ! NAs introduced by coercion

Recibimos una **alerta** (*warning*) que fácilmente podríamos ignorar: como la columna era de tipo texto, al convertirla a numérica introdujimos datos perdidos. El problema es que esta alerta puede quedar ahogada dentro de un *pipeline* extenso, y podemos no darnos cuenta del problema!

Si agregamos una **nueva prueba de validación** luego de ese cambio, ahora obtendremos un error que detendrá el *pipeline* si la **calidad** esperada de nuestros datos no se cumple:

``` r
datos |> 
  expect_col_vals_not_null(valor)
```

    Error:
    ! Exceedance of failed test units where values in `valor` should not have been NULL.
    The `expect_col_vals_not_null()` validation failed beyond the absolute threshold level (1).
    * failure level (1) >= failure threshold (1)

Uno de los usos de `{pointblank}` es ir agregando pasos de **validación de datos** cada vez que sea necesario, por ejemplo:

- Al cargar datos externos
- Luego de modificar/limpiar los datos
- Luego de transformaciones complejas, como [`pivot_wider()`](https://bastianolea.rbind.io/blog/r_introduccion/tidyr_pivotar/) o [`left_join()`](https://bastianolea.rbind.io/blog/left_join/)
- Al actualizar los datos
- Antes de exportarlos o pasarlos al siguiente paso

Incluso podemos ir agregando varias pruebas de validación seguidas:

``` r
datos |>
  # probar la cantidad de filas
  expect_row_count_match(5) |> 
  # probar que los valores estén dentro de un conjunto
  expect_col_vals_in_set(nombre, letters) |> 
  # probar que no existan ciertos valores
  expect_col_vals_not_in_set(valor, c(88, 99)) |> 
  # probar el tipo de una columna
  expect_col_is_numeric(valor) |>
  # probar que los valores estén dentro de un rango, incluyendo NA
  expect_col_vals_between(valor, 10, 80, na_pass = TRUE)
```

En el ejemplo anterior le agregamos 5 pruebas:

- Que la cantidad de filas sea la esperada, con `expect_row_count_match()`
- Que los valores estén dentro de un conjunto, con `expect_col_vals_in_set()`
- Que no existan ciertos valores, con `expect_col_vals_not_in_set()`
- Que el tipo de una columna, con `expect_col_is_numeric()`
- Que los valores estén dentro de un rango, con `expect_col_vals_between()`

De esta manera, las pruebas nos ayudan a mantener la **confianza en el procesamiento de los datos**, ya que validamos constantemente que los cambios en los datos no introducendo problemas que podrían pasar desapercibidos, o que serían tediosos de ir probando manualmente todo el rato. También es muy útil para confirmar que los datos siguen siendo los esperados luego de actualizarlos.

Si te interesa esto, revisa el tutorial completo de validación de datos con `{pointblank}` aquí:

**Publicación relacionada:** [Validación de datos con {testthat} y {pointblank}](https://bastianolea.rbind.io/blog/validacion_datos/index.md): La validación de datos sirve para verificar durante el proceso de análisis si los datos cumplen con requerimientos de calidad y con tus expectativas, con el objetivo de evitar problemas futuros…

## Recursos

- [Página oficial de `{pointblank}`](https://rstudio.github.io/pointblank/index.html)
- [Introduction to the Pipeline Data Validation Workflow](https://rstudio.github.io/pointblank/articles/VALID-II.html)
