R中的数据帧何时为数字



我偶然发现了以下问题。我有一个data.frame

A <- data.frame(let = c("A", "B", "C"), x = 1:3, y = 4:6)

其列的类别为

sapply(A, class)
let         x         y 
"factor" "integer" "integer" 
s.numeric(A$x)
[1] TRUE
is.numeric(A)
[1] FALSE

我不明白为什么A$xB$x虽然是数字,但仅由这两列组成的data.frame不是数字

is.numeric(A[, c("x", "y")])
[1] FALSE

删除factor列没有帮助。。。

B <- A
B$let <- NULL
is.numeric(B)
[1] FALSE
is.numeric(B$x)
[1] TRUE
is.numeric(B$y)
[1] TRUE

因此,我尝试创建一个仅使用A中的数字列构建的新数据集。它是数字吗?不…

C <- data.frame(B$x, B$y)
is.numeric(C)
[1] FALSE
C <- data.frame(as.numeric(B$x), as.numeric(B$y))
is.numeric(C)
[1] FALSE

我这里一定少了什么东西。有什么帮助吗?

数据帧始终是一个数据帧,独立于其列的类。所以你得到的是预期的行为

如果您想检查数据帧中的所有列是否都是数字,可以使用以下代码

all(sapply(A, is.numeric))
## [1] FALSE
all(sapply(A[, c("x", "y")], is.numeric))
## [1] TRUE

只有数字数据的表也可以理解为矩阵。您可以将数据帧的数字列转换为矩阵,如下所示:

M <- as.matrix(A[, c("x", "y")])
M
##      x y
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6

矩阵M现在是真正的数字:

is.numeric(M)
## [1] TRUE

我们需要在vector而不是data.frame上应用该函数

sapply(A[c("x", "y")], is.numeric)

而不是

is.numerc(A)

根据?is.numeric

is.numeric的方法只应在类的基类型为double或integer并且值可以合理地视为数字的情况下返回true(例如,对它们进行算术运算是有意义的,并且应该通过基类型进行比较(。

"A"的classdata.frame,而不是numeric

class(A)
#[1] "data.frame"
sapply(A, class)

只有当对象的classnumericinteger时,is.numeric才返回TRUE。

因此,除非我们在vector或提取的列上应用is.numeric,否则data.frame永远不可能是numeric。这就是为什么,我们在lapply/sapply的循环中进行,其中我们将列作为vector,它的类将是该列的类

相关内容

  • 没有找到相关文章

最新更新