webentwicklung-frage-antwort-db.com.de

So prüfen Sie, ob zwei Datenrahmen gleich sind

Angenommen, ich habe große Datensätze in R und möchte nur wissen, ob zwei davon identisch sind. Ich benutze dies oft, wenn ich verschiedene Algorithmen experimentiere, um das gleiche Ergebnis zu erzielen. Angenommen, wir haben die folgenden Datensätze:

df1 <- data.frame(num = 1:5, let = letters[1:5])
df2 <- df1
df3 <- data.frame(num = c(1:5, NA), let = letters[1:6])
df4 <- df3

Also das ist, was ich tue, um sie zu vergleichen:

table(x == y, useNA = 'ifany')

Was funktioniert gut, wenn die Datensätze keine NAs haben:

> table(df1 == df2, useNA = 'ifany')
TRUE 
  10 

Aber nicht so sehr, wenn sie NAs haben:

> table(df3 == df4, useNA = 'ifany')
TRUE <NA> 
  11    1 

In dem Beispiel ist es einfach, NA als kein Problem zu verwerfen, da wir wissen, dass beide Datenrahmen sind gleich sind. Das Problem ist, dass NA == <anything>NA ergibt. Wenn also einer der Datensätze einen NA enthält, spielt es keine Rolle, was der andere an derselben Position hat, sondern das Ergebnis wird immer NA sein.

Die Verwendung von table() zum Vergleichen von Datensätzen erscheint mir daher nicht ideal. Wie kann ich besser überprüfen, ob zwei Datenrahmen identisch sind?

P.S .: Beachten Sie, dass dies kein Duplikat von R - Vergleichen mehrerer Datensätze , Vergleichen von 2 Datensätzen in R oder Vergleichen von Datensätzen in R ist

40
Waldir Leoncio

Look up all.equal. Es hat einige Fahrer, aber es könnte für Sie arbeiten.

all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
55
TheComeOnMan

Wie Metrics hervorhob, könnte man auch identical() verwenden, um die Datensätze zu vergleichen. Der Unterschied zwischen diesem Ansatz und dem von Codoremifa besteht darin, dass identical() nur TRUE von FALSE ergibt, abhängig davon, ob die zu vergleichenden Objekte identisch sind oder nicht, während all.equal() entweder TRUE zurückgibt oder Hinweise auf die Unterschiede zwischen den Objekten gibt. Betrachten Sie zum Beispiel Folgendes:

> identical(df1, df3)
[1] FALSE

> all.equal(df1, df3)
[1] "Attributes: < Component 2: Numeric: lengths (5, 6) differ >"                                
[2] "Component 1: Numeric: lengths (5, 6) differ"                                                
[3] "Component 2: Lengths: 5, 6"                                                                 
[4] "Component 2: Attributes: < Component 2: Lengths (5, 6) differ (string compare on first 5) >"
[5] "Component 2: Lengths (5, 6) differ (string compare on first 5)"   

Darüber hinaus scheint nach dem, was ich getestet habe, identical() viel schneller zu laufen als all.equal().

24
Waldir Leoncio