我观察到了这一点:
> class(x)
[1] "numeric"
> str(x)
num [1:2500] 1 1 1 1 1 1 1 1 1 1 ...
> table(x)
1
2500
> table(x == 1)
FALSE TRUE
299 2201
> all.equal(x, rep(1,length(x)))
[1] TRUE
> dput(x)
c(1, ..... 1) # all ones
这怎么可能?我理解floating point numbers should not be compared using ==
in general,但不应table
与==
一致吗?
PS。显然,table
与all.equal
一致,而与==
不一致,因为它首先将其参数转换为因子(即字符串)。
PPS。 table(x-1)
显示非0值。
答案 0 :(得分:9)
文档中的哪个部分承诺它们会保持一致? table
期望“一个或多个可以被解释为因子的对象”,即内部执行factor(x)
,它会先将x
转换为一个字符,然后转换为一个因子。
x <- 1 - 1e-16
x == 1
#[1] FALSE
as.character(x)
#1] "1"
factor(x) == "1"
#[1] TRUE
答案 1 :(得分:1)
只是解决可能对all.equal
做什么的误解。 table
不与all.equal
一致,因为默认情况下,后者在比较数值时会包含公差因子。来自?all.equal
:
公差
数值≥0。不报告小于容差的差异。默认值接近1.5e-8。
也就是说,all.equal
应该被解释为“所有近似相等”(在给定的数值精度限制内)。