¿Cómo eliminar filas con datos duplicados?

Author

Cousteau Consultant Group

Published

January 13, 2024

Explora nuestros posts y nuestros cursos

Recuerda que tenemos diversos posts y dictamos cursos de programación, pesquerías, ecología, entre otros. Te invitamos a revisar la lista completa de nuestros posts en nuestra sección Posts y suscribirte a nuestras redes en Facebook y X para enterarte de nuestros cursos y de sus aperturas próximas.

En el análisis de datos, es importante tener datos limpios y sin errores. Los datos duplicados pueden causar problemas, como sesgos en los resultados del análisis. Por eso, es importante saber cómo eliminarlos.

En Excel

Archivos de ejemplo

Los archivos utilizados en los artículos de Posts se encuentran alojados en nuestro repositorio de Github: https://github.com/CousteauG/posts-data.git.

  • El primer paso es ir a la pestaña Datos y dar click en el botón Quitar duplicados.

  • A continuación, se abrirá una ventana en donde podremos indicar qué columnas deseamos incluir para considerar en la remoción de datos duplicados. En nuestro ejemplo, hacemos click en Seleccionar todo y luego en Aceptar.

  • Se mostrará una ventana a modo de reporte en donde nos indica que se halló 2045 filas con datos duplicados y que la tabla resultado contiene 955 filas.

En R

require(readxl)
require(dplyr)

puntos_pesca <- read_xlsx(path = "puntos-de-pesca.xlsx", sheet = 1)

puntos_pesca
# A tibble: 955 × 5
   fecha               captura   lon    lat embarcacion
   <dttm>                <dbl> <dbl>  <dbl> <chr>      
 1 2010-01-02 00:00:00    543. -83.8  -6.63 E          
 2 2009-10-17 00:00:00    769. -85.9  -6.06 E          
 3 2010-01-04 00:00:00    497. -81.1  -8.26 C          
 4 2009-12-04 00:00:00    654. -84.7  -5.57 C          
 5 2009-12-31 00:00:00    436. -78.4 -11.6  E          
 6 2009-12-15 00:00:00    559. -81.1 -13.5  B          
 7 2010-02-20 00:00:00    695. -80.4 -11.5  E          
 8 2009-12-03 00:00:00    506. -82.5  -9.09 C          
 9 2009-11-02 00:00:00    540. -80.6  -8.62 D          
10 2009-12-03 00:00:00    391. -79.0 -10.6  E          
# ℹ 945 more rows

Podemos observar que el archivo se ha leído correctamente, identificando un total de 3000 filas.

  • A continuación utilizaremos la función distinct sobre el objeto puntos_pesca y almacenamos el resultado en un objeto llamado sin_duplicados:
sin_duplicados <- puntos_pesca |> 
  
  distinct()

sin_duplicados
# A tibble: 955 × 5
   fecha               captura   lon    lat embarcacion
   <dttm>                <dbl> <dbl>  <dbl> <chr>      
 1 2010-01-02 00:00:00    543. -83.8  -6.63 E          
 2 2009-10-17 00:00:00    769. -85.9  -6.06 E          
 3 2010-01-04 00:00:00    497. -81.1  -8.26 C          
 4 2009-12-04 00:00:00    654. -84.7  -5.57 C          
 5 2009-12-31 00:00:00    436. -78.4 -11.6  E          
 6 2009-12-15 00:00:00    559. -81.1 -13.5  B          
 7 2010-02-20 00:00:00    695. -80.4 -11.5  E          
 8 2009-12-03 00:00:00    506. -82.5  -9.09 C          
 9 2009-11-02 00:00:00    540. -80.6  -8.62 D          
10 2009-12-03 00:00:00    391. -79.0 -10.6  E          
# ℹ 945 more rows

Observamos que en la tabla sin_duplicados contiene 955 filas, es decir, exactamente el mismo resultado que con el ejemplo realizado en Excel.

¿Qué significan los comandos |> y %>%?

Ambos comandos hacen referencia a operadores de R llamados pipe. La principal diferencia entre ambos es que %>% fue implementado por el paquete magrittr, mientras que |> lo implementa nativamente R desde su versión 4.1.0.

En cualquiera de los casos, permiten tomar todo lo que se encuentre a la izquierda del comando y pasarlo como valor (de primer argumento) a la función que se ejecute a la derecha del pipe.

# Esto...
unique(iris$Species)
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
# ...equivale a esto
iris$Species %>% unique()
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
# ...y a esto
iris$Species |> unique()
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica

La ventaja que proponen es la posibilidad de hacer crear comandos muy largos (en donde lo que cambia es sobre todo el primer argumento) que crecen hacia abajo en lugar de hacia la derecha:

# Esto...
length(unique(iris$Species))
[1] 3
# ...equivale a esto
iris$Species %>% unique() %>% length()
[1] 3
# ...y a esto
iris$Species |> unique() |> length()
[1] 3

Existen algunas diferencias y consideraciones adicionales, como por ejemplo que %>% permite omitir los paréntesis de la función a la derecha del pipe siempre y cuando no se desee ejecutar ningún argumento adicional.

iris$Species %>% unique %>% length
[1] 3
iris$Species %>% unique() %>% length()
[1] 3

Esto último NO es posible con el pipe |> de R, en donde SIEMPRE se requerirán los paréntesis en la función de la derecha.

Quitar duplicados utilizando algunas columnas

Como vimos anteriormente, en Excel es posible seleccionar qué columnas deseamos utilizar para la búsqueda de duplicados. Entonces, ¿qué hacer si deseamos, por ejemplo, quitar únicamente las filas con datos duplicados en las columnas fecha y embarcacion?

sin_duplicados <- puntos_pesca |> 
  
  # Colocar las columnas separadas por comas
  distinct(fecha, embarcacion)

sin_duplicados
# A tibble: 612 × 2
   fecha               embarcacion
   <dttm>              <chr>      
 1 2010-01-02 00:00:00 E          
 2 2009-10-17 00:00:00 E          
 3 2010-01-04 00:00:00 C          
 4 2009-12-04 00:00:00 C          
 5 2009-12-31 00:00:00 E          
 6 2009-12-15 00:00:00 B          
 7 2010-02-20 00:00:00 E          
 8 2009-12-03 00:00:00 C          
 9 2009-11-02 00:00:00 D          
10 2009-12-03 00:00:00 E          
# ℹ 602 more rows

Por defecto, distinct devolverá una tabla considerando únicamente las columnas utilizadas para el filtrado. Si deseamos que devuelva todas las columnas, bastará con definir el argumento .keep_all = TRUE:

sin_duplicados <- puntos_pesca |> 
  
  distinct(fecha, embarcacion, .keep_all = TRUE)

sin_duplicados
# A tibble: 612 × 5
   fecha               captura   lon    lat embarcacion
   <dttm>                <dbl> <dbl>  <dbl> <chr>      
 1 2010-01-02 00:00:00    543. -83.8  -6.63 E          
 2 2009-10-17 00:00:00    769. -85.9  -6.06 E          
 3 2010-01-04 00:00:00    497. -81.1  -8.26 C          
 4 2009-12-04 00:00:00    654. -84.7  -5.57 C          
 5 2009-12-31 00:00:00    436. -78.4 -11.6  E          
 6 2009-12-15 00:00:00    559. -81.1 -13.5  B          
 7 2010-02-20 00:00:00    695. -80.4 -11.5  E          
 8 2009-12-03 00:00:00    506. -82.5  -9.09 C          
 9 2009-11-02 00:00:00    540. -80.6  -8.62 D          
10 2009-12-03 00:00:00    391. -79.0 -10.6  E          
# ℹ 602 more rows
Ventajas

Si bien podría parecer similar el tiempo de desarrollo y ejecución de estos procesos en ambos programas (Excel y R), debemos teneer en cuenta que hacerlo en R tiene ventajas como:

  • Escalabilidad: R es un lenguaje de programación, por lo que si se desea aplicar un mismo proceso a varios archivos de un formato similar, bastará con incluir nuestro script dentro de un bucle.
  • Cantidad de datos: Excel NO es un software preparado para trabajar con grandes cantidades de datos o tablas (límite de 1 048 576 filas). Por otro lado, en R los límites los define la RAM de nuestro equipo y a la fecha existen varios paquetes (dplyr, tidyr, data.table, etc.) que permiten manejar tablas con decenas de millones de filas en tiempos razonables.
  • Gama de funciones: Trabajar los datos en R pone a disposición del usuario una enorme variedad de funciones distribuidas en diversos paquetes (librerías), los cuales proporcionan herramientas estadísticas, de limpieza de datos, análisis SIG, figuras, diseño web, entre otros.