R сравнение двух массивов - PullRequest
4 голосов
/ 08 мая 2020

Я хотел бы сравнить два массива. Мне нужно проверить почти равенство между каждым элементом. Я использую all.equal(target, current , tolerance = ...), но, вероятно, это неправильно или, может быть, я не понимаю, как работает all.equal. Я бы хотел что-нибудь с таким поведением:

 a <-array(1:18, dim=c(3,3,2))
 b <- a
 b[3,3,2] <-18.01
 all.equal(a,b,tolerance = 0.1) # return TRUE
 all.equal(a,b,tolerance = 0.001) # return TRUE
 newFunction(a,b, tolerance = 0.1) # return TRUE
 newFunction(a,b, tolerance = 0.001) # return FALSE

Следует ли векторизовать all.equal? Подскажите пожалуйста

1 Ответ

4 голосов
/ 08 мая 2020

Я думаю, что проблема здесь в том, что параметр tolerance не выполняет то, что вы хотите. Вы надеетесь, что он отметит любые индивидуальные различия, превышающие 0,001, но функция all.equal() работает, учитывая среднюю относительную разницу доступных записей. То есть он по своей сути сравнивает все в совокупности вместо того, чтобы искать поэлементно.

Если вам нужно поэлементное сравнение, вам лучше просто написать его напрямую, например @ Ben's комментарий all(abs(a-b) < .001) или, предположительно, того, что делает ваш newFunction().


Для дальнейшего удаления sh нюанса all.equal():

c <- a / 10
d <- c
d[3, 3, 2] <- 1.81
all.equal(c, d, tolerance = 0.1)   # returns TRUE
all.equal(c, d, tolerance = 0.001) # returns the mean relative difference

Разница в последняя строка с соответствующей строкой означает, что средняя относительная разница теперь превышает tolerance 0,001, хотя абсолютные различия между c и d идентичны между a и b. all.equal() не только эффективно учитывает различия всех записей одновременно, но и масштабирует их до размеров записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...