is.na()的行为与is.numeric()不同 - 其中一致性是什么?

时间:2017-12-29 15:32:25

标签: 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返回相同类型的数据框?它只输出一个&#34; FALSE&#34;。

is.numeric(df)

[1] FALSE

对某些地方的数据类型,类等有很好的解释吗?我经常读到这些东西,但对它们没有坚实的感觉。我没有得到矩阵和数据框之间的区别,或者num和dbl之间的区别。这些东西很容易混淆。

我做了Cyclismo&#34;基本数据类型&#34;教程,但想深入挖掘一下。

3 个答案:

答案 0 :(得分:5)

首先 - 文档

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

  

泛型函数is.na表示缺少哪些元素。

因此is.na会告诉您对象中缺少哪些元素。

来自?is.numeric

  

is.numeric是对可被解释为数字的对象的更一般的测试。

因此is.numeric告诉您对象是否为数字(而不是对象中的单个元素是否为数字)。

这些行为完全符合记录 - is.na(df)告诉您数据框的哪些元素缺失。 is.numeric(df)告诉您df不是numeric(事实上,它是data.frame)。

是否不一致?

我可以看到这似乎不一致。只有少数is.*函数在元素方面起作用。 is.nais.finiteis.nan是我唯一能想到的。所有其他is.*函数都适用于整个对象。当等式测试不起作用时,这些函数基本上是与==进行相等性测试的替身(下面有更多内容)。但是一旦你对数据结构有了更多的了解,它们似乎并不矛盾,因为它们实际上没有其他意义。

is.numeric理解它的方式

is.numeric以元素方式应用是没有意义的。向量是数字还是不是数字 - 无论它是否具有缺失值。如果您想将is.numeric函数应用于数据框的每一列,则可以执行

sapply(df, is.numeric)

这会告诉您两列都是numeric可以提出一个参数,即is.numeric()给定数据框时的默认行为应该是将它应用于每一列,但有可能有人想要确保某些内容是{{{ 1}}向量,而不是numeric(或其他任何内容),并且例如,有一列data.framedata.frameTRUE可能会导致混淆和错误。

is.numeric()理解它的方式

相反,is.na 以元素方式应用是没有意义的。 is.na是单个值的替代,而不是像NA这样的复杂对象。拥有一个“缺失”的数据框是没有意义的 - 你可能有一个缺失值,但没有什么可以告诉你它是一个数据框。但是,data.frame(或向量或矩阵......)可以包含缺失值,而data.frame会告诉您确切的位置。

这与平等(或其他比较)的工作原理非常相似。您还可以使用is.na检查数据框中的1,或使用df == 1检查小于5的值。 df < 5是检查缺失值的推荐方法 - is.na()返回anything == NA,因此NA不起作用。 df == NA是执行此操作的正确方法。

为实现这一目标,is.na(df)实际上有很多方法。您可以使用is.na看起来像他们。在我目前的R会议中,我看到了

methods("is.na")

这告诉我所有这些不同类型的对象都支持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()将尝试处理它。

次要问题

  

我没有区分矩阵和数据框,或者num和dbl。这些东西很容易混淆。

is.na.default vs num与R无关。我很震惊任何针对R初学者的内容都会提到双打 - 它不应该。如果您查看dbl的帮助,请参阅。

  

?double相同。

     

... numeric是一个通用函数。它与as.double相同。

出于R目的,请忘记术语as.numeric,然后使用double

  

我没有区分矩阵和数据框

两者都是矩形 - 行和列。 numeric只能在其中包含一个数据类型/类 - 整个矩阵为matrix,或numericcharacter等,没有混合。 integer每列可以有不同的类,第一列可以是数字,第二列可以是第三列,等等。

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

答案 1 :(得分:4)

主要是因为is.numeric()中的测试适用于整个对象(因此返回一个表示整个对象是否为数字的值),而is.na()适用于对象的各个元素。

下一个更微妙的问题(你还没有问过,但可能会问下一个问题)是:为什么没有is.numeric()返回TRUE,因为数据框的所有元素都是数字的?这是因为数据框在内部表示为列表,并且可能包含不同类型的元素(is.numeric(as.matrix(df))确实返回TRUE)。

答案 2 :(得分:0)

str(df)
'data.frame':   3 obs. of  2 variables:
$ VarA: num  1 NA 5
$ VarB: num  NA 2 7

要考虑的是,is.na正在测试向量中出现的每个值...而is.numeric正在检查对象本身的类。从某种意义上说,它是苹果到橙子。可以这样想,

此对象不可用(NA)?由于它存在,检查测试向量中包含的每个对象。这个对象是一个数字吗?不,它是一个data.frame