# Contar datos perdidos en una o varias columnas

> Cuando estamos limpiando datos frecuentemente nos preguntamos cuántos datos perdidos tiene una columna. La respuesta se obtiene pidiendo un resumen (summarize()) que cuente la suma de datos perdidos (sum(is.na())) en una columna específica. ¿Pero qué pasa si tienes muchas columnas? No vas a andar escribiendo las columnas una por una… 😵‍💫 Usando las función across() de {dplyr}, podemos aplicar la misma operación a todas las columnas de un dataframe, y así obtener el conteo de datos perdidos de todas las columnas.

- URL: https://bastianolea.rbind.io/blog/2025-10-21/
- Fecha: 2025-10-21
- Autor: Bastián Olea Herrera
- Etiquetas: datos perdidos, limpieza de datos

---

Cuando estamos limpiando datos frecuentemente nos preguntamos **cuántos [datos perdidos](https://bastianolea.rbind.io/tags/datos-perdidos/) tiene una columna.** La respuesta se obtiene pidiendo un resumen (`summarize()`) que cuente la suma de datos perdidos (`sum(is.na())`) en una columna específica.

``` r
library(dplyr)

# contar datos perdidos en una columna
iris |> 
  summarize(
    missings = sum(is.na(Sepal.Length))
  )
```

      missings
    1        0

¿Pero qué pasa si tienes muchas columnas y quieres revisarlo en todas? No vas a andar escribiendo las columnas una por una... 😵‍💫

Usando las función `across()` de `{dplyr}`, podemos aplicar la misma operación a todas las columnas de un dataframe, y así obtener el **conteo de datos perdidos de todas las columnas.**

Primero creemos datos perdidos al azar [con el paquete `{messy}` para ensuciar datos:](https://github.com/nrennie/messy)

``` r
library(messy)

iris_m <- messy::make_missing(iris)
```

Ahora con `summarize()` calculamos un *resumen* de datos (es decir, reducir las filas de la tabla a un sólo resultado), especificando con `across()` que el resumen será *a través de* todas las columnas (`everything()`), y finalmente pedimos que el resumen sea la suma (`sum()`) de los datos de cada columna (`.x`) que son *missing* `is.na()`.

``` r
library(dplyr)

iris_m |>
  # resumir los datos
  summarize(
    # a través de todas las columnas
    across(
      everything(),
      # contar la cantidad de missings
      ~sum(is.na(.x))
    )
  )
```

      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1           15          17           10          12      21

El mismo código sirve si quieres contar todos los ceros, o todos los valores infinitos, etc.

``` r
# contar los ceros
iris_m |> 
  summarize(
    across(everything(),
           ~sum(.x == 0, na.omit = TRUE)
           ))
```

      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1           NA          NA           NA          NA      NA

``` r
# contar infinitos
iris_m |> 
  summarize(
    across(everything(),
           ~sum(is.infinite(.x))
           ))
```

      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1            0           0            0           0       0

``` r
# etc
```

Si quieres saber los datos perdidos sólo en las **columnas numéricas**, en vez de `everything()` puedes usar `where(is.numeric)`, o si necesitas saberlo en un conjunto de columnas específicas, usa `starts_with()` o pon sus nombres dentro de `c()`.

También hay otras formas de revisar [datos perdidos](https://bastianolea.rbind.io/tags/datos-perdidos/), como por ejemplo con [el paquete `{visdat}`](https://bastianolea.rbind.io/blog/visdat/) que **resume tus datos visualmente**.
