2015-10-26 91 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應該被解釋爲(的數值精度在給定範圍內來),意思是「所有大約相等」。