让我们创建数据框:
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.frame
说 TRUE
至 is.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 toas.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/