R: all.equal与all的区别

3
我正在尝试使用all和all.equal测试两个向量是否相等,但它们给出不同的结果,我不确定原因是什么。
> x = seq(0,1,by=0.2)
> x
[1] 0.0 0.2 0.4 0.6 0.8 1.0
 > y = c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
> all(x == y)
[1]  FALSE
> all.equal(x, y)
[1] TRUE

似乎 x == y 返回 [1] TRUE TRUE TRUE FALSE TRUE TRUE - coffeinjunky
或许相关: https://dev59.com/_Gkw5IYBdhLWcg3w_fiJ - coffeinjunky
2
== 测试精确相等性,而 all.equal 测试 "接近相等性" 以允许浮点错误。 - alistaire
请使用 dplyr::near() 而不是 ==isTRUE(all.equal()) - M.Viking
1个回答

5

看起来你已经陷入了 R语言第一层地狱,在这里浮点数的行为不如预期。

出问题的是 x[4] 和 y[4] 这一对(正如上面 coffeeinjunky 的评论)。仔细查看它们:

> print(c(x[4], y[4]))
[1] 0.6 0.6
> print(c(x[4], y[4]), digits = 16)
[1] 0.6000000000000001 0.6000000000000000

all.equal有一个默认的容差级别约为1.5e-8,低于此阈值的差异不会被报告。这就是为什么all.equal(x, y)返回TRUE,而all(x==y)返回FALSE。

本文更详细地讨论了这个问题: R中数值比较困难


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接