53

How do I check if two objects, e.g. dataframes, are value equal in R?

By value equal, I mean the value of each row of each column of one dataframe is equal to the value of the corresponding row and column in the second dataframe.

smci
  • 26,085
  • 16
  • 96
  • 138
mindless.panda
  • 3,806
  • 3
  • 32
  • 56

4 Answers4

63

It is not clear what it means to test if two data frames are "value equal" but to test if the values are the same, here is an example of two non-identical dataframes with equal values:

a <- data.frame(x = 1:10)
b <- data.frame(y = 1:10)

To test if all values are equal:

all(a == b) # TRUE

To test if objects are identical (they are not, they have different column names):

identical(a,b) # FALSE: class, colnames, rownames must all match.
David LeBauer
  • 28,793
  • 27
  • 106
  • 180
14

In addition, identical is still useful and supports the practical goal:

identical(a[, "x"], b[, "y"]) # TRUE
Brad Horn
  • 639
  • 6
  • 11
9

We can use the R package compare to test whether the names of the object and the values are the same, in just one step.

a <- data.frame(x = 1:10)
b <- data.frame(y = 1:10)

library(compare)
compare(a, b)
#FALSE [TRUE]#objects are not identical (different names), but values are the same.

In case we only care about equality of the values, we can set ignoreNames=TRUE

compare(a, b, ignoreNames=T)
#TRUE
#  dropped names

The package has additional interesting functions such as compareEqual and compareIdentical.

milan
  • 4,106
  • 1
  • 17
  • 32
0

Without the need to rely on another package, but to compare structure (class and attributes) of two data sets:

structure_df1 <- sapply(df1, function(x) paste(class(x), attributes(x), collapse = ""))
structure_df2 <- sapply(df2, function(x) paste(class(x), attributes(x), collapse = ""))

all(structure_df1 == structure_df2)
MS Berends
  • 2,677
  • 1
  • 21
  • 35