web-dev-qa-db-fra.com

Comment vérifier si deux trames de données sont égales

Disons que j'ai de grands ensembles de données dans R et je veux juste savoir si deux d'entre eux sont identiques. Je l'utilise souvent lorsque j'expérimente différents algorithmes pour obtenir le même résultat. Par exemple, supposons que nous ayons les jeux de données suivants:

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

Voici donc ce que je fais pour les comparer:

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

Ce qui fonctionne très bien lorsque les ensembles de données n'ont pas de NA:

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

Mais pas tant quand ils ont des NA:

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

Dans l'exemple, il est facile de rejeter le NA comme n'étant pas un problème car nous savons que les deux dataframes sont égaux. Le problème est que NA == <anything> Donne NA, donc chaque fois qu'un des ensembles de données a un NA, peu importe ce que l'autre a sur cette même position, le résultat va toujours être NA.

Donc, utiliser table() pour comparer des ensembles de données ne me semble pas idéal. Comment puis-je mieux vérifier si deux trames de données sont identiques?

P.S .: Notez qu'il ne s'agit pas d'un doublon de R - comparaison de plusieurs jeux de données , comparaison de 2 jeux de données dans R ou comparaison de jeux de données dans R

40
Waldir Leoncio

Recherchez all.equal. Il a des cavaliers mais ça pourrait marcher pour vous.

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

Comme Metrics l'a souligné, on pourrait également utiliser identical() pour comparer les jeux de données. La différence entre cette approche et celle de Codoremifa est que identical() ne fera que produire TRUE de FALSE, selon que les objets comparés sont identiques ou non, tandis que all.equal() renverra soit TRUE soit des conseils sur les différences entre les objets. Par exemple, tenez compte des éléments suivants:

> 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)"   

De plus, d'après ce que j'ai testé, identical() semble fonctionner beaucoup plus rapidement que all.equal().

24
Waldir Leoncio