让我们创建数据框架:
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不返回相同类型的数据帧?它只输出一个“假”。
is.numeric(df)
[1] FALSE对数据类型、类等有一个很好的解释吗?我经常读到这些东西,但对它们没有牢固的感觉。我不知道矩阵和数据帧之间的区别,或者num和dbl之间的区别。很容易把这些东西混为一谈。
我做了Cyclismo“基本数据类型”教程,但想深入一点。
发布于 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.na,is.finite,is.nan是我唯一能想到的。所有其他is.*函数都在整个对象上工作。当等式测试不起作用时,这些函数本质上是使用==进行等式测试的支柱(下面将详细介绍)。但是,一旦你对数据结构有了更多的了解,它们就不会显得不一致了,因为从另一个角度来说,它们真的没有什么意义。
is.numeric是有意义的
将is.numeric应用于元素方面是没有意义的。向量要么是数字的,要么不是完整的--不管它是否有缺失的值。如果要将is.numeric函数应用于数据帧的每一列,则可以这样做。
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会话中,我看到
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可以对它的每个列都有不同的类,第一列可以是数值列,第二列可以是第二个字符,第三个因素等等。
矩阵更简单、更有效,非常适合线性代数运算。数据帧更常见,因为具有混合类型的数据是常见的。
发布于 2017-12-29 15:46:25
主要是因为is.numeric()中的测试适用于整个对象(因此返回一个值,该值表示整个对象是否为数字),而is.na()则适用于对象的单个元素。
下一个更微妙的问题(您还没有问,但可能会问下一个问题)是:为什么is.numeric()不返回TRUE,因为数据框架的所有元素都是数字的?这是因为数据帧内部表示为列表,可以包含不同类型的元素(is.numeric(as.matrix(df))确实返回TRUE)。
发布于 2017-12-29 15:51:38
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
https://stackoverflow.com/questions/48024838
复制相似问题