Ответ 1
Посмотрите all.equal. У него есть некоторые райдеры, но это может сработать для вас.
all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
Скажем, у меня большие массивы данных в 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
Посмотрите all.equal. У него есть некоторые райдеры, но это может сработать для вас.
all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
Как отметил 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()
.