我偶然发现了以下问题。我有一个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$x
和B$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"的class
是data.frame
,而不是numeric
class(A)
#[1] "data.frame"
sapply(A, class)
只有当对象的class
是numeric
或integer
时,is.numeric
才返回TRUE。
vector
或提取的列上应用is.numeric
,否则data.frame
永远不可能是numeric
。这就是为什么,我们在lapply/sapply
的循环中进行,其中我们将列作为vector
,它的类将是该列的类