# Encuentra diferencias entre objetos de R con {waldo}

> {waldo} es un paquete de R para encontrar diferencias entre objetos y conjuntos de datos. Es muy útil para solucionarnos problemas comunes que generalmente intentamos resolver a mano (o a ojo, jaja). Aprende a usarlo con algunos ejemplos prácticos.

- URL: https://bastianolea.rbind.io/blog/waldo/
- Fecha: 2025-11-10
- Autor: Bastián Olea Herrera
- Etiquetas: limpieza de datos, consejos, datos perdidos
- Recursos: [Paquete](https://waldo.r-lib.org)

---

[`{waldo}`](https://waldo.r-lib.org) es un paquete de R para encontrar diferencias entre objetos y conjuntos de datos.

Creemos dos vectores de datos de ejemplo:

``` r
vector_a <- c("a", "b", "c", "d", "e")
vector_b <- c("a", "b", "c", "f")
```

Si los comparamos con la función `all.equal()`, de R base, obtenemos un resultado poco informativo:

``` r
# comparar con base
all.equal(vector_a, vector_b)
```

    [1] "Lengths (5, 4) differ (string compare on first 4)"
    [2] "1 string mismatch"                                

Básicamente nos dice "son distintos" 🤨

Pero si usamos `waldo::compare()`, obtenemos una comparación ordenada y clara de las diferencias:

``` r
# comparar con waldo
waldo::compare(vector_a, vector_b)
```

![](https://bastianolea.rbind.io/blog/waldo/waldo_1.png)

Se nos informa con color de las diferencias en los datos.

Probemos con otro ejemplo simple de vectores similares:

``` r
vector_c <- c("a", "b", "c", "d")
vector_d <- c("d", "b", "c", "a")

waldo::compare(vector_c, vector_d)
```

![](https://bastianolea.rbind.io/blog/waldo/waldo_2.png)

La comparación destaca las diferencias de posición entre ambos vectores.

Desordenemos y ensuciemos un dataframe con ayuda del [paquete `{messy}`, de Nicola Rennie,](https://nrennie.rbind.io/messy/) para compararlo con su versión original:

``` r
iris_b <- iris |> messy::messy()

compare(iris, iris_b)
```

![](https://bastianolea.rbind.io/blog/waldo/waldo_4.png)

Las diferencias son tantas que indica que las variables son de tipo distinto, y muestra sus primeras observaciones.

Hagamos otra verión sucia de `iris` para comparar ambos dataframe sucios:

``` r
iris_c <- iris |> messy::messy()

compare(head(iris_b), head(iris_c))
```

![](https://bastianolea.rbind.io/blog/waldo/waldo_5.png)

En este caso te muestra las filas de ambas tablas intercaladas, para que se vean las diferencias, y luego muestra las columnas con los primeros valores distintos.

Hagamos otro par de versiones sucias, pero ahora que sólo difieran en su cantidad de datos perdidos o *missing*:

``` r
iris_c <- iris |> messy::make_missing()
iris_d <- iris |> messy::make_missing()

compare(iris_c, iris_d)
```

![](https://bastianolea.rbind.io/blog/waldo/waldo_6.png)

En este caso, va destacando las diferencias entre ambos dataframes, indicando con color sus cambios y la cantidad extra de cambios que hay.

Para terminar, veamos un ejemplo más práctico: acá hay dos tablas de datos con **muchas columnas**, todas con nombres levemente distintos. Es una situación que pasa mucho cuando nos encontramos con datos cuyas columnas son solamente ids de variables que luego hay que ir a buscar a un diccionario de datos, y que por lo tanto tienen nombres muy parecidos 😣

| var_ead32 | var_efe23 | var_eea31 | var_edr52 | var_ead30 | var_eae31 |
|----------:|----------:|----------:|----------:|----------:|----------:|
| 0.1150604 | 0.7647429 | 0.5429455 | 0.5328345 | 0.2072198 | 0.3364374 |

| var_ead32 | var_efe23 | var_eae31 | var_ede52 | var_ead30 | var_eae30 |
|----------:|----------:|----------:|----------:|----------:|----------:|
| 0.8271902 | 0.0638212 | 0.5359525 | 0.9399669 | 0.8877144 |   0.36798 |

Así a la rápida es casi imposible saber si las columnas son las mismas, o si no lo son, cuáles sobran y cuáles faltan! 😭

``` r
compare(tabla_a, tabla_b)
```

![](https://bastianolea.rbind.io/blog/waldo/waldo_3.png)

Así podemos ver claramente que hay tres columnas distintas entre ambas tablas, y cuáles son, en vez de partirnos la cabeza y los ojos comparando nombres de columnas 🤓
