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
值,而在输出中被视为notNA
值
我知道(这会更好)我可以通过将向量转换成一个因子来解决我的问题,但尽管如此,我还是很想知道这里发生了什么。有人有想法吗?我想到的第一个想法是看一看表
的定义,它的开头是:
> 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.