R 带“的函数表的意外行为”;“南”;价值观

R 带“的函数表的意外行为”;“南”;价值观,r,na,R,Na,最近,我在表函数中遇到了一个行为,这不是我所期望的: is.na(ex_vec) # [1] FALSE FALSE FALSE FALSE FALSE TRUE 例如,让我们采用以下向量: ex_vec <- c("Non", "Non", "Nan", "Oui", "NaN", NA) 但如果我试图得到不同的频率值: table(ex_vec) #ex_vec #Nan Non Oui # 1 2 1 “NaN”未出现在表中 但是,如果我“要求”表显示NA值,我会

最近,我在
函数中遇到了一个行为,这不是我所期望的:

is.na(ex_vec)
# [1] FALSE FALSE FALSE FALSE FALSE  TRUE
例如,让我们采用以下向量:

ex_vec <- c("Non", "Non", "Nan", "Oui", "NaN", NA)
但如果我试图得到不同的频率值:

table(ex_vec)
#ex_vec
#Nan Non Oui 
#  1   2   1
“NaN”
未出现在表中

但是,如果我“要求”
显示
NA
值,我会得到以下结果:

table(ex_vec, useNA="ifany")
#ex_vec
# Nan  NaN  Non  Oui <NA> 
#   1    1    2    1    1
表格(ex_vec,useNA=“ifany”)
#ex_vec
#楠楠非优
#   1    1    2    1    1
因此,字符串
“NaN”
表调用中被视为
NA
值,而在输出中被视为not
NA


我知道(这会更好)我可以通过将向量转换成一个
因子来解决我的问题,但尽管如此,我还是很想知道这里发生了什么。有人有想法吗?

我想到的第一个想法是看一看
的定义,它的开头是:

> table
function (..., exclude = if (useNA == "no") c(NA, NaN), useNA = c("no", 
    "ifany", "always"), dnn = list.names(...), deparse.level = 1) 
{
听起来合乎逻辑,默认情况下表排除
NA
NaN

从表代码中我们可以看到,如果
x
不是一个因子,它会将其强制为一个因子(文档中说,这里没有什么新内容)

在这里,我们得到了它,排除参数,即使是
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
>ex_vec排除as.vector(排除“字符”)
[1] 那“南”
>匹配(ex_vec,as.vector(不包括“字符”))
[1] NA NA 2 1

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

因子
匹配向量的级别时,它会将其
排除
列表转换为与输入向量相同的类型:

exclude <- as.vector(exclude, typeof(x))
哦,天哪。现在将排除真正的
“NaN”
字符串

要修复此问题,请在
表中使用
exclude=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.

令人放心……

这只是基本用法。。比如“为什么
sum(c(1,NA))
返回NA?”
table(…,exclude=if(useNA==“no”)c(NA,NaN),useNA=c(“no”,“ifany”,“always”)
我不明白这些的目的answers@rawr解释为什么字符串被视为
NaN
值?这不是要问的用法,而是为什么。它没有文档中包含的求和示例那么明显。(我的意思是:
NaN!=“NaN”
那么
为什么是“NaN”
排除,因为它不是排除向量的一部分)@Tensibai再次,文档说
排除:所有因素要删除的级别
级别不是
NA
,也不是
NaN
,它们是字符串..aways字符串尝试
表(1,排除=1)
@rawr我清楚地理解这对你来说是显而易见的,根据这个问题的分数(以及我自己为找到根本原因而挠头),这对每个人来说都不是那么明显……所以我确实认为答案会帮助其他人。(而且
NA
是一个有效级别,即使不是字符串对象,但我明白你的观点
NaN
在字符向量中无效)大家安静下来!我认为发现这种行为令人困惑是合理的。
exclude
可以被合理地读取以引用要排除的所提供向量的元素。因此,如果您告诉它排除
NaN
,这是数字,它仍然会排除
“NaN”,这可能会令人惊讶
这是字符。感谢@Tensibai的解释!为什么“NaN”在
表中仍然是一个常规值,而不是在
末尾?@CathG,因为级别在创建时排序;)参见
级别
行中系数代码中的注释,一旦未排除,它们将变为正常entries@CathG当table参数设置为“no”以外的值时,它们不会被删除,并被视为普通字符串,没有特殊意义。非常感谢您给出这个非常清晰的答案(我也喜欢factor doc中的引用!)
exclude <- as.vector(exclude, typeof(x))
as.vector(exclude, typeof(letters))
[1] NA    "NaN"
 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.