让我们创建数据框:
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;教程,但想深入挖掘一下。
答案 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.na
,is.finite
,is.nan
是我唯一能想到的。所有其他is.*
函数都适用于整个对象。当等式测试不起作用时,这些函数基本上是与==
进行相等性测试的替身(下面有更多内容)。但是一旦你对数据结构有了更多的了解,它们似乎并不矛盾,因为它们实际上没有其他意义。
is.numeric
理解它的方式 is.numeric
以元素方式应用是没有意义的。向量是数字还是不是数字 - 无论它是否具有缺失值。如果您想将is.numeric
函数应用于数据框的每一列,则可以执行
sapply(df, is.numeric)
这会告诉您两列都是numeric
。 可以提出一个参数,即is.numeric()
给定数据框时的默认行为应该是将它应用于每一列,但有可能有人想要确保某些内容是{{{ 1}}向量,而不是numeric
(或其他任何内容),并且例如,有一列data.frame
说data.frame
到TRUE
可能会导致混淆和错误。
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
,或numeric
或character
等,没有混合。 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