2015-12-03 22 views
16

最近,我面臨table功能,這不是我所期待的一種行爲:意外行爲值

例如,我們採取以下向量:

ex_vec <- c("Non", "Non", "Nan", "Oui", "NaN", NA) 

如果我在矢量檢查NA值,"NaN"不被視爲一個(預期):

is.na(ex_vec) 
# [1] FALSE FALSE FALSE FALSE FALSE TRUE 

但是,如果我嘗試得到不同的頻率值:

table(ex_vec) 
#ex_vec 
#Nan Non Oui 
# 1 2 1 

"NaN"沒有出現在表格中。

但是,如果我「問」 table展現NA值,我得到這個:

table(ex_vec, useNA="ifany") 
#ex_vec 
# Nan NaN Non Oui <NA> 
# 1 1 2 1 1 

所以,字符串"NaN"被視爲NA值內table通話,同時在治療輸出爲不是NA的值。

我知道(這會更好,我可以通過將我的矢量轉換爲factor來解決我的問題,但是,我真的很想知道這裏發生了什麼。有人有想法嗎?

+1

這只是基本用法..像「爲什麼'和(C(1,NA)) '回來不適合?「 'table(...,exclude = if(useNA ==「no」)c(NA,NaN),useNA = c(「no」,「ifany」,「always」)'我不明白這些答案 – rawr

+4

@rawr解釋了爲什麼一個*字符串*被認爲是一個'NaN'值?這不是被問到的用法,而是它的原因,它不如文檔中涵蓋的總和示例明顯。我的意思是:'NaN!=「NaN」'那麼爲什麼''NaN'''被排除,因爲它不是排除向量的一部分) – Tensibai

+0

@Tensibai再次,文檔說'排除:所有因素去除的水平_levels_ 'NA'也不是'NaN',它們是_strings_ .. aways _strings_嘗試'table(1,exclude = 1)' – rawr

回答

13

factor相匹配水平矢量就其exclude列表轉換爲相同類型的輸入向量:

exclude <- as.vector(exclude, typeof(x)) 

因此,如果您的排除列表具有NaN和你的矢量字符,出現這種情況:

as.vector(exclude, typeof(letters)) 
[1] NA "NaN" 

哦,親愛的。現在真正的"NaN"字符串將被排除。

要修復,使用tableexclude=NA(和factor如果你作出可能打這個因素)。

我的文檔喜歡這個爲factor

There are some anomalies associated with factors that have ‘NA’ as 
a level. It is suggested to use them sparingly, e.g., only for 
tabulation purposes. 

讓人欣慰......

+0

非常感謝您提供這個非常明確的答案(我也喜歡因子doc的引用!) – Cath

5

來到我的腦海裏第一個想法是看看table定義,開始由:

> table 
function (..., exclude = if (useNA == "no") c(NA, NaN), useNA = c("no", 
    "ifany", "always"), dnn = list.names(...), deparse.level = 1) 
{ 

聽起來合乎邏輯,默認表排除NANaN

在表格代碼中挖掘我們看到,如果x不是一個因素,它會將它強制爲一個因素(這裏沒有新東西,它在文檔中說過)。

else { 
     a <- factor(a, exclude = exclude) 

我沒有發現任何其他可能已經影響到輸入強迫"NaN"NA值。

所以尋找到的因素,以獲得爲什麼我們找到問題的根源:

> factor 
function (x = character(), levels, labels = levels, exclude = NA, 
    ordered = is.ordered(x), nmax = NA) 
{ 
[...] # Snipped for brievety 
    exclude <- as.vector(exclude, typeof(x)) 
    x <- as.character(x) 
    levels <- levels[is.na(match(levels, exclude))] # defined in the snipped part above, is the sorted unique values of input vector, coerced to char. 
    f <- match(x, levels) 
[...] 
    f 
} 

在這裏,我們得到了它,排除參數,甚至是NA值被強制轉換爲字符向量。

那麼什麼情況是:

> ex_vec <- c("Non", "Non", "Nan", "Oui", "NaN", NA) 
> excludes<-c(NA,NaN) 
> as.vector(excludes,"character") 
[1] NA "NaN" 
> match(ex_vec,as.vector(excludes,"character")) 
[1] NA NA NA NA 2 1 

我們做匹配字符「南」作爲排除向量作爲比較之前被強制轉換爲字符。

+0

謝謝@Tensibai的解釋!爲什麼「NaN」仍然在'table'結果中作爲常規值排序,而不是以''結尾? – Cath

+1

@CathG由於水平在創建時被排序;)在'levels'行看到因子代碼中的評論,一旦沒有被排除,它們就成爲正常條目 – Tensibai

+1

@CathG當表參數設置爲'不'時,它們不會被刪除並視爲沒有特殊含義的普通字符串 – Tensibai