2015-09-22

Cómo comparar dos data frames en R

Title

Problema

Queremos comparar dos data frames en R y comprobar si tienen las mismas filas o no. También deseamos saber las filas que son iguales y diferentes.

Datos

   Date Time   pH
1  10/8  600 3.85
2  10/9  800 4.05
3 10/10 1300 3.95
   Date Time   pH
1  10/8  600 3.85
2 10/12  900 4.05
3 10/10 1300 3.95
df1 <- read.table(text="Date    Time    pH
                  1   10/8    600     3.85
                  2   10/9    800     4.05
                  3   10/10   1300    3.95", 
                  head=TRUE)
df2 <- read.table(text="Date    Time    pH
                  1    10/8    600     3.85
                  2    10/12   900     4.05
                  3    10/10   1300    3.95", 
                  head=TRUE)

Soluciones

Si solamente deseamos saber si dos data frames son o no iguales, es tan sencillo como:

identical(df1, df2)
[1] FALSE

Para comparar fila a fila, disponemos de varias alternativas con diferentes paquetes. A efectos ilustrativos calculamos las filas en df1 que no se encuentran en df2. Para obtener las de df2 no presentes en df2, alterar el orden en el código.

  • Paquete compare
  • library(compare)
    compare(df1, df2)
    
    FALSE [FALSE, FALSE, TRUE]
    La salida de datos indica primero si el data frame es igual y entre corchetes si las filas son iguales (TRUE) o no (FALSE). Si queremos incluir los valores no disponibles (NAs), utilizamos la función addNA:

  • Paquete dplyr
  • library(dplyr)
    
    Filas diferentes presentes en el df1

    anti_join(df1, df2)
    
      Date Time   pH
    1 10/9  800 4.05
    Filas comunes

    semi_join(df1, df2)
    
       Date Time   pH
    1  10/8  600 3.85
    2 10/10 1300 3.95
  • Paquete sqldf
  • library(sqldf)
    
    Filas diferentes presentes en el df1

    sqldf('SELECT * FROM df1 EXCEPT SELECT * FROM df2')
    
      Date Time   pH
    1 10/9  800 4.05
    Filas comunes

    sqldf('SELECT * FROM df1 INTERSECT SELECT * FROM df2')
    
       Date Time   pH
    1  10/8  600 3.85
    2 10/10 1300 3.95

    Entradas relacionadas

    Referencias

    No hay comentarios:

    Publicar un comentario

    Nube de datos