Mostrando entradas con la etiqueta Eliminar duplicados. Mostrar todas las entradas
Mostrando entradas con la etiqueta Eliminar duplicados. Mostrar todas las entradas

2016-05-04

Eliminar duplicados de un data frame basándonos en dos columnas en R

Title

Problema

Queremos eliminar las filas duplicadas, considerando éstas como aquellas que tienen el mismo valor en las columnas col1 y col2 ignorando su orden. En el siguiente ejemplo solamente conservaríamos una fila.

  Col1 Col2 database
1    A    B   IntAct
2    A    B     Bind
3    B    A  BioGrid
df <- structure(list(Col1 = c("A", "A", "B"), Col2 = c("B", "B", "A"
), database = c("IntAct", "Bind", "BioGrid")), .Names = c("Col1", 
"Col2", "database"), class = "data.frame", row.names = c(NA, 
-3L))

Solución

Emplearemos el paquete sqldf.

  • Primera fila
  • En el caso de querer conservar la primera fila. Creamos una columna id para identificar la primera ocurrencia.

    library(sqldf)
    df$id <- seq.int(nrow(df))
    sqldf("select col1, col2, database, min(id) id
          from (select col1, col2, database, id from df where col1 <= col2
          union all
          select col2 col1, col1 col2, database, id from df where col1 > col2) 
          group by col1, col2")
    
      col1 col2 database id
    1    A    B   IntAct  1
    

  • Última fila
  • En el caso de querer conservar la última fila. En este caso el código es más conciso pues no necesitamos crear una columna para identificar la primera ocurrencia.

    sqldf("select col1, col2, database 
          from (select col1, col2, database from df where col1 <= col2 
          union all 
          select col2 col1, col1 col2, database from df where col1 > col2) 
          group by col1, col2")
    
     col1 col2 database
    1    A    B  BioGrid
    

    Entradas relacionadas

    Referencias

    2015-06-29

    Eliminar duplicados de un data frame en R

    Title

    Problema

    Deseamos eliminar los duplicados de un data frame en R.

    Solución

    Disponemos de múltiples opciones. Emplearemos como ejemplo el conjunto de datos iris que contiene dos filas duplicadas: la 102 y la 143

  • Paquete base
  • Detectamos los duplicados.

    # De arriba a abajo
    anyDuplicated(iris) # Número de fila
    iris[duplicated(iris), ]  # Fila
    
        Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    143          5.8         2.7          5.1         1.9 virginica
    
    # De abajo a arriba
    anyDuplicated(iris, fromLast = TRUE)
    iris[duplicated(iris, fromLast = TRUE), ]
    
        Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    102          5.8         2.7          5.1         1.9 virginica
    
    Eliminamos los duplicados.

    unique(iris)
    iris[!duplicated(iris), ]
    # En orden inverso
    unique(iris, fromLast = TRUE)
    iris[!duplicated(iris, fromLast = TRUE), ]
    
  • Paquete dplyr
  • library(dplyr)
    iris %>% distinct
    
  • Paquete sqldf
  • library(sqldf)
    sqldf('SELECT DISTINCT * FROM iris')
    

    Notas

    Usando el paquete base veremos que conserva el número de filas —150— aunque observaremos, dependiendo del orden que hayamos escogido, que la fila 102 o 143 habrá desaparecido. En cambio con dplyr y sqldf, el resultado numera de nuevo las filas, mostrando la última con el número 149.

    Entradas relacionadas

    Nube de datos