首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >is.na()的行为与is.numeric()不同-一致性在哪里?

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

Stack Overflow用户
提问于 2017-12-29 15:32:25
回答 3查看 1.2K关注 0票数 3

让我们创建数据框架:

代码语言:javascript
复制
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的位置。

代码语言:javascript
复制
is.na(df)

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

为什么is.numeric不返回相同类型的数据帧?它只输出一个“假”。

代码语言:javascript
复制
is.numeric(df)

[1] FALSE

对数据类型、类等有一个很好的解释吗?我经常读到这些东西,但对它们没有牢固的感觉。我不知道矩阵和数据帧之间的区别,或者num和dbl之间的区别。很容易把这些东西混为一谈。

我做了Cyclismo“基本数据类型”教程,但想深入一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-29 15:50:56

第一-文件

让我们来看一下文档。来自?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函数应用于数据帧的每一列,则可以这样做。

代码语言:javascript
复制
sapply(df, is.numeric)

这将告诉您,这两列都是numeric。您可以提出这样一个论点:当is.numeric()被赋予一个数据框架时,默认的行为应该是将它应用于每一列,但是可能有人想要确保某些东西是numeric向量,而不是data.frame (或其他任何东西),并且如果有一个单列的data.frame say TRUE to is.numeric(),可能会导致混淆和错误。

is.na是有意义的

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

这与平等(或其他比较)的工作原理基本相同。您还可以用df == 1检查数据帧中的1s,或者用df < 5检查小于5的值。is.na()是检查缺少值的推荐方法-- anything == NA返回NA,因此df == NA不起作用。is.na(df)是正确的方法。

要做到这一点,is.na实际上有许多方法。你可以用methods("is.na")来看他们。在我当前的R会话中,我看到

代码语言:javascript
复制
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将尝试处理它。

次要问题

我不知道矩阵和数据帧之间的区别,或者num和dbl之间的区别。很容易把这些东西混为一谈。

num vs dbl与R无关,我很惊讶任何针对R初学者的东西都会提到双打--不应该。如果你看?double的帮助,它包括。

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

为了R的目的,忘记术语double,只使用numeric

我不知道矩阵和数据帧之间的区别

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

矩阵更简单、更有效,非常适合线性代数运算。数据帧更常见,因为具有混合类型的数据是常见的。

票数 5
EN

Stack Overflow用户

发布于 2017-12-29 15:46:25

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

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

票数 4
EN

Stack Overflow用户

发布于 2017-12-29 15:51:38

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48024838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档