我想比较两个数组。我需要测试每个元素之间的近似相等性。
我正在使用 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 吗?
你能给我一个提示吗
最佳答案
我认为这里的断开是 tolerance
参数不做你想要的。您希望它能够标记任何大于 0.001 的个体差异,但 all.equal()
函数通过考虑可用条目的平均相对差异来工作。也就是说,它本质上是将所有内容进行汇总比较,而不是逐个元素地进行比较。
如果你想要逐个元素的比较,你最好直接写一个,比如@Ben 的评论 all(abs(a-b) < .001)
,或者大概是你的 newFunction()
做。
进一步充实 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()
有效地同时考虑所有条目的差异,但它也会将它们缩放到条目的大小。
关于R比较两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61680119/