Подтвердить что ты не робот

Как проверить, равны ли два кадра данных

Скажем, у меня большие массивы данных в R, и я просто хочу знать, являются ли они двумя из них одинаковыми. Я часто использую это, когда я экспериментирую с разными алгоритмами для достижения того же результата. Например, скажем, у нас есть следующие наборы данных:

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

Вот что я делаю, чтобы сравнить их:

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

Что отлично работает, когда на наборах данных нет NA:

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

Но не так много, когда у них есть NA:

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

В этом примере легко отклонить NA как не проблему, так как мы знаем, что оба эти кадра равны. Проблема в том, что NA == <anything> дает NA, поэтому, если у одного из наборов данных есть NA, не имеет значения, что другой имеет в этой же позиции, результат всегда будет NA.

Поэтому использование table() для сравнения наборов данных для меня не кажется идеальным. Как я могу лучше проверить, идентичны ли два кадра данных?

PS: Обратите внимание, что это не дубликат R - сравнение нескольких наборов данных, Сравнение двух наборов данных в R или Сравнение наборов данных в R

4b9b3361

Ответ 1

Посмотрите all.equal. У него есть некоторые райдеры, но это может сработать для вас.

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

Ответ 2

Как отметил Metrics, можно было бы использовать identical() для сравнения наборов данных. Разница между этим подходом и тем, что Codoremifa заключается в том, что identical() просто даст TRUE of FALSE, в зависимости от того, являются ли сравниваемые объекты одинаковыми или нет, тогда как all.equal() либо вернет TRUE, либо подскажет о различиях между объектами. Например, рассмотрим следующее:

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

Кроме того, из того, что я тестировал, identical() работает намного быстрее, чем all.equal().