2015-10-26 19 views
3

我观察此:数据一致性:表VS ==

> 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值。

+1

对我来说它工作正常 –

+3

@sds不确定你的评论意味着什么。怎么样一个可重复的例子? – Frank

+2

你可以使用'dput' – akrun

回答

9

在文档中它承诺它们会一致吗? table期望“可以被解释为因素的一个或多个对象”,即,在内部确实是factor(x),其首先将x变成字符,然后变成因子。

x <- 1 - 1e-16 
x == 1 
#[1] FALSE 
as.character(x) 
#1] "1" 
factor(x) == "1" 
#[1] TRUE 
1

就解决什么all.equal做一个可能的误解。 table不是all.equal一致,因为后者在默认情况下在比较数值时包含容差因子。从?all.equal

公差不报
小于公差数值≥0的差异。默认值接近1.5e-8。

即,all.equal应该被解释为(的数值精度在给定范围内来),意思是“所有大约相等”。