具有“NaN”值的函数表的意外行为

问题描述 投票:0回答:3

最近,我在

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
来解决我的问题,但尽管如此,我真的很想知道这里发生了什么。有人有想法吗?

r na
3个回答
13
投票

factor
匹配向量的级别时,它将其
exclude
列表转换为与输入向量相同的类型:

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

因此,如果您的排除列表有

NaN
并且您的向量是字符,则会发生这种情况:

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

哦亲爱的。现在真正的

"NaN"
字符串将被排除。

要修复,请在

exclude=NA
中使用
table
(如果您正在制定可能会影响此问题的因素,请使用
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.

放心...


5
投票

我想到的第一个想法是看一下

table
定义,其开头为:

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

听起来合乎逻辑,默认情况下表排除

NA
NaN

在表代码中挖掘,我们发现如果

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

我们将字符“NaN”匹配为排除向量,因为在比较之前已将其强制为字符。


0
投票

好的,对于非编码员的住宅太阳能业主,您能告诉我们 NaN 代表什么吗?请给我们傻瓜式的 NaN 答案。

© www.soinside.com 2019 - 2024. All rights reserved.