我今天发现了一些奇怪的事情,我想问你是否有合理的理由我所看到的,或者你认为这是一个应该报告给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
谢谢。
答案 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"