当两个都是浮点数时,假设我想测试'a'是否小于或等于'b'。我会选择
isTRUE(all.equal(a,b)) || a <= b
我想知道是否有比这更好的方法。 是否存在类似于all.equal的函数,它允许“接近相等”?或者等于(/大于等于)?
如果不是单个数字而是人们想要比较浮动的两个向量,那该怎么办?
更新:@shadow指向我Numeric comparison difficulty in R
当然可以明确地设置容差并避免all.equal:
tol = 1e-5
# a equals b
abs(a-b) <= tol
# a less or equal to b
a <= b + tol
以下是关于绝对与相对容忍度的一些讨论:http://realtimecollisiondetection.net/blog/?p=89
我想一如既往,没有“正确”的方式来实现这一点。
答案 0 :(得分:3)
有趣的问题。我确信有更好的方法,但是这个简单的函数需要double
s的两个向量,并且如果它们在元素方面(mode = "ae"
)几乎相等则返回,给定指定的容差。它也可以返回,如果它们小于(mode = "lt"
)或者它们几乎等于或小于(mode = "ne.lt"
),以及它们的"gt"
等价物......
near_equal <- function( x , y , tol = 1.5e-8 , mode = "ae" ){
ae <- mapply( function(x,y) isTRUE( all.equal( x , y , tolerance = tol ) ) , x , y )
gt <- x > y
lt <- x < y
if( mode == "ae" )
return( ae )
if( mode == "gt" )
return( gt )
if( mode == "lt" )
return( lt )
if( mode == "ne.gt" )
return( ae | gt )
if( mode == "ne.lt" )
return( ae | lt )
}
# And in action....
set.seed(1)
x <- 1:5
# [1] 1 2 3 4 5
y <- 1:5 + rnorm(5,sd=0.1)
# [1] 0.9373546 2.0183643 2.9164371 4.1595281 5.0329508
near_equal( x , y , tol = 0.05 , mode = "ae" )
#[1] FALSE TRUE TRUE TRUE TRUE
near_equal( x , y , tol = 0.05 , mode = "ne.gt" )
#[1] TRUE TRUE TRUE TRUE TRUE
希望有所帮助。