R中的数据一致性:table vs ==

时间:2015-10-26 16:34:11

标签: r

我观察到了这一点:

> 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。显然,tableall.equal一致,而与==不一致,因为它首先将其参数转换为因子(即字符串)。

PPS。 table(x-1)显示非0值。

2 个答案:

答案 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应该被解释为“所有近似相等”(在给定的数值精度限制内)。