r - 具有 "NaN"值的函数表的意外行为

标签 r na

最近,我在 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值(value)观,我明白了:
table(ex_vec, useNA="ifany")
#ex_vec
# Nan  NaN  Non  Oui <NA> 
#   1    1    2    1    1

因此,字符串 "NaN"被视为 NA内部值 table调用,同时在输出中被视为不是 NA值(value)。

我知道(这会更好)我可以通过将向量转换为 factor 来解决我的问题。尽管如此,我真的很想知道这里发生了什么。有没有人有想法?

最佳答案

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

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

所以如果你的排除列表有 NaN并且您的向量是字符,会发生这种情况:
as.vector(exclude, typeof(letters))
[1] NA    "NaN"

哦亲爱的。现在真正的"NaN"字符串将被排除。

要修复,请使用 exclude=NAtable (和 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.

让人放心...

关于r - 具有 "NaN"值的函数表的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070563/

相关文章:

r - RPostgreSQL 中的查询非常慢

r - 如何从 R 中的数据集中删除问号(?)

r - 在 R 中编写一个包含 if/else 语句和 rowSums() 的函数,定义如何处理 NA

R:将参数传递给外部()

r - 将漂亮的 data.frames/tables 打印到控制台

r - 如何在 R 代码中将小于 0 的栅格值替换为 NA

r - 如何用 NAs - R 简单地计算行数

r - 可以处理 NA 的 leap() 的替代方法是什么?

r - 使用 mapply 速度问题更新 data.table

R 相当于 Matlab 对 Schur 分解的重新排序?