【问题标题】:as.matrix not preserving the data mode of an empty data.frameas.matrix 不保留空 data.frame 的数据模式
【发布时间】:2012-03-16 23:54:01
【问题描述】:

我今天发现了一些奇怪的东西,我想问你我所看到的是否有合理的原因,或者你是否认为这是一个应该报告给 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 版

谢谢。

【问题讨论】:

  • 不知道为什么会发生这种情况,但您最好在发布到 R-devel 之前在最新的快照上对其进行测试。他们不喜欢 6 个月大的 R 版本的“错误报告”。
  • 我在这里得到相同的行为,R 版本 2.14.1 (2011-12-22)。
  • 我在 2.14.2 看到了同样的事情

标签: r type-conversion


【解决方案1】:

这是因为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"

【讨论】:

  • 谢谢你 Joshua,我希望我知道如何像你一样找到进入 R 基础代码的方法。我停在print(as.matrix)...
  • @flodel: print(as.matrix) 显示UseMethod("as.matrix"),然后我查看methods(as.matrix)。然后可以使用print(as.matrix.data.frame)查看data.frame方法。如果该方法恰好是“不可见的”,您可以使用getAnywhere(例如getAnywhere("as.matrix.dist"))。
  • 这些对我以后会有很大的帮助,感谢Joshua的跟进。
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多