r - is.na() 的行为与 is.numeric() 不同——一致性在哪里?

标签 r

让我们创建数据框:

df <- data.frame(VarA = c(1, NA, 5), VarB = c(NA, 2, 7))

  VarA VarB
1    1   NA
2   NA    2
3    5    7

如果我运行一个简单的 NA 查询,它会显示每个 NA 的位置。
is.na(df)

      VarA  VarB
[1,] FALSE  TRUE
[2,]  TRUE FALSE
[3,] FALSE FALSE

为什么不is.numeric返回相同类型的数据框?它只输出一个“FALSE”。
is.numeric(df)

[1] FALSE

某处是否对数据类型、类等有很好的解释?我经常读到这些东西,但对它们没有确切的感觉。我不明白矩阵和数据框之间的区别,或者 num 与 dbl 之间的区别。很容易将这些东西混为一谈。

我做了 Cyclismo“基本数据类型”教程,但想更深入地挖掘。

最佳答案

首先 - 文档

让我们转向文档。来自 ?is.na :

The generic function is.na indicates which elements are missing.



所以is.na用于告诉您对象中缺少哪些单个元素。

来自 ?is.numeric :

is.numeric is a more general test of an object being interpretable as numbers.



所以is.numeric告诉您对象是否为数字(而不是对象中的各个元素是否为数字)。

这些行为与文档完全一致 - is.na(df)告诉您数据框的哪些元素丢失。 is.numeric(df)告诉你什么df不是 numeric (实际上,它是一个 data.frame )。

不一致吗?

我可以看到这似乎不一致。只有几个is.*按元素工作的函数。 is.na , is.finite , is.nan是我唯一能想到的。所有其他 is.*函数作用于整个对象。这些函数本质上是使用 == 进行相等性测试的替代品。当相等测试不起作用时(更多内容见下文)。但是一旦您对数据结构有了更多的了解,它们似乎就不会不一致了,因为反过来说它们真的没有意义。
is.numeric它是有道理的
is.numeric 没有意义以元素方式应用。一个向量要么是数字要么不是全部——无论它是否有缺失值。如果您想申请 is.numeric函数到数据框的每一列,你可以做
sapply(df, is.numeric)

这会告诉你这两列都是 numeric .您可以论证 is.numeric() 时的默认行为给出一个数据框应该是将它应用到每一列,但可能有人想确保某事是 numeric向量,不是 data.frame (或其他任何东西),并且有,比如说,一列 data.frameTRUEis.numeric()可能会导致混淆和错误。
is.na它是有道理的

相反,它对 is.na 没有意义。不应用于元素方面。 NA是单个值的替代品,而不是像 data.frame 这样的复杂对象.有一个“缺失”的数据框真的没有意义——你可能有一个缺失的值,但没有什么可以告诉你它是一个数据框。然而data.frame (或向量,或矩阵...)可以包含缺失值,并且 is.na会告诉你他们在哪里。

这与相等(或其他比较)的工作原理几乎相同。您还可以使用 df == 1 检查数据框中的 1s ,或者对于小于 5 的值,使用 df < 5 . is.na()是检查缺失值的推荐方法 - anything == NA返回 NA , 所以 df == NA对此不起作用。 is.na(df)是正确的方法来做到这一点。

为此,is.na其实方法很多。你可以用 methods("is.na") 查看它们.在我当前的 R session 中,我看到
methods("is.na")
 [1] is.na,abIndex-method       is.na,denseMatrix-method   is.na,indMatrix-method    
 [4] is.na,nsparseMatrix-method is.na,nsparseVector-method is.na,sparseMatrix-method 
 [7] is.na,sparseVector-method  is.na.coxph.penalty*       is.na.data.frame          
[10] is.na.data.table*          is.na.integer64*           is.na.numeric_version     
[13] is.na.POSIXlt              is.na.raster*              is.na.ratetable*          
[16] is.na.Surv*  

这表明所有这些不同类型的对象都支持 is.na()打电话很好地告诉我其中缺失值的位置。如果我在另一个对象类上调用它,那么 is.na.default会尽力处理。

次要问题

I don't get the difference between a matrix and data frame, or num vs dbl. It's easy to conflate these things.


num对比 dbl与 R 无关。令我感到震惊的是,针对 R 初学者的任何内容都会提到 double - 它不应该。如果您查看 ?double 的帮助信息这包括。

It is identical to numeric.

... as.double is a generic function. It is identical to as.numeric.



出于 R 目的,忘记术语 double只需使用 numeric .

I don't get the difference between a matrix and data frame



两者都是矩形 - 行和列。 A matrix里面只能有一种数据类型/类 - 整个矩阵是 numeric , 或 character , 或 integer等,没有混合。 A data.frame每一列可以有不同的类,第一列可以是数字,第二个字符,第三个因子等。

矩阵更简单,效率更高,非常适合线性代数运算。数据框更为常见,因为混合类型的数据很常见。

关于r - is.na() 的行为与 is.numeric() 不同——一致性在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48024838/

相关文章:

r - R 中是否有 "quote words"运算符?

r - 形式参数 "type"与多个实际参数匹配

python - 独立 R 脚本加载依赖项的性能

r - R中文件路径的原始文本字符串

r - 通过row.names子集矩阵

html - 在 R 中解析 HTML 文件

r - 在 ggplot2 中,如何使 stat_function 服从 scale_x_log10?

r - 在 R 中测量音乐波形的偏差?

r - 使用 data.table 包通过引用进行条件二进制连接和更新

r - 创建名称数量不断增加的随机数据框列表