as.matrix不保留空data.frame的数据模式

时间:2012-03-16 23:54:02

标签: r type-conversion

我今天发现了一些奇怪的事情,我想问你是否有合理的理由我所看到的,或者你认为这是一个应该报告给R-devel团队的错误:

df <- data.frame(a = 1L:10L)
class(df$a)
# [1] "integer"
m <- as.matrix(df)
class(m[, "a"])
# [1] "integer"

到目前为止并不令人惊讶:as.matrix保留数据模式,此处为“整数”。但是,使用空(无行)data.frame:

df <- data.frame(a = integer(0))
class(df$a)
# [1] "integer"
m <- as.matrix(df)
class(m[, "a"])
# [1] "logical"

知道为什么模式从“整数”变为“逻辑”吗?我使用的是版本2.13.1

谢谢。

1 个答案:

答案 0 :(得分:4)

这是因为as.matrix.data.frame中的这一行:

if (any(dm == 0L)) return(array(NA, dim = dm, dimnames = dn))

基本上,如果任何维度为零,则会得到NA的数组“完整”。我说“完整”因为没有任何观察,因为其中一个维度为零。

班级为logical的原因是因为这是NA的班级。其他课程有特殊的NA,但这里并不是必需的。例如:

> class(NA)
[1] "logical"
> class(NA_integer_)
[1] "integer"
> class(NA_real_)
[1] "numeric"
> class(NA_complex_)
[1] "complex"
> class(NA_character_)
[1] "character"