R中的数字比较难度
我试图将R中的两个数字作为if语句条件的一部分进行比较:
(ab) >= 0.5
在这个特定的例子中,a = 0.58和b = 0.08 ...,而(ab) >= 0.5
是错误的。 我意识到使用==
进行确切的数字比较的危险,这似乎是相关的:
(a - b) == 0.5)
是假的,而
all.equal((a - b), 0.5)
为真。
我能想到的唯一解决方案是有两个条件: (ab) > 0.5 | all.equal((ab), 0.5)
(ab) > 0.5 | all.equal((ab), 0.5)
。 这是有效的,但这真的是唯一的解决方案吗? 我是不是应该戒掉的=
家庭比较运营商永远的?
编辑清楚:我知道这是一个浮点问题。 更基本的是,我问的是:我应该怎么做呢? 因为>=
不能真正被信任,所以在R中处理大于或等于比较的明智方式是什么?
我从来都不all.equal
这样的东西。 在我看来,容忍有时候会以神秘的方式发挥作用。 为什么不检查大于容差小于0.05的东西?
tol = 1e-5
(a-b) >= (0.05-tol)
一般来说,如果没有四舍五入,只用传统的逻辑,我会发现比all.equal更好的直接逻辑
如果x == y
则xy == 0
。 也许xy
并不完全是0,因此我使用这种情况
abs(x-y) <= tol
无论如何,您必须为all.equal
设置容差,这比all.equal
更简洁明了。
如果你想经常使用这种方法,你可以创建它作为一个单独的运算符或覆盖原始的> =函数(可能不是一个好主意):
# using a tolerance
epsilon <- 1e-10 # set this as a global setting
`%>=%` <- function(x, y) (x + epsilon > y)
# as a new operator with the original approach
`%>=%` <- function(x, y) (all.equal(x, y)==TRUE | (x > y))
# overwriting R's version (not advised)
`>=` <- function(x, y) (isTRUE(all.equal(x, y)) | (x > y))
> (a-b) >= 0.5
[1] TRUE
> c(1,3,5) >= 2:4
[1] FALSE FALSE TRUE
为了完整起见,我会指出,在某些情况下,您可以简单舍入到小数点后几位(与前面公布的更好的解决方案相比,这是一种蹩脚的解决方案)。
round(0.58 - 0.08, 2) == 0.5
链接地址: http://www.djcxy.com/p/10027.html
上一篇: Numeric comparison difficulty in R
下一篇: Detecting request type in PHP (GET, POST, PUT or DELETE)