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

as.matrix不保留空data.frame的数据模式,r,type-conversion,R,Type Conversion,今天我发现了一些奇怪的事情,我想问你我看到的东西是否有逻辑上的原因,或者你是否认为这是一个应该向R-devel团队报告的bug: df <- data.frame(a = 1L:10L) class(df$a) # [1] "integer" m <- as.matrix(df) class(m[, "a"]) # [1] "integer" 你知道为什么这里的模式从“整数”变为“逻辑”吗?我使用的是2.13.1版 谢谢。这是因为as.matrix.data.frame中的这一行:

今天我发现了一些奇怪的事情,我想问你我看到的东西是否有逻辑上的原因,或者你是否认为这是一个应该向R-devel团队报告的bug:

df <- data.frame(a = 1L:10L)
class(df$a)
# [1] "integer"
m <- as.matrix(df)
class(m[, "a"])
# [1] "integer"
你知道为什么这里的模式从“整数”变为“逻辑”吗?我使用的是2.13.1版


谢谢。

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

if (any(dm == 0L)) return(array(NA, dim = dm, dimnames = dn))
基本上,如果任何维度为零,您将得到一个数组“full”of
NA
。我说“满”是因为没有任何观测,因为其中一个维度是零

该类之所以是
逻辑的
,是因为它是
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"

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

if (any(dm == 0L)) return(array(NA, dim = dm, dimnames = dn))
基本上,如果任何维度为零,您将得到一个数组“full”of
NA
。我说“满”是因为没有任何观测,因为其中一个维度是零

该类之所以是
逻辑的
,是因为它是
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"

不知道为什么会发生这种情况,但在发布到R-devel之前,最好在最新的快照上进行测试。他们不喜欢6个月前版本的R上的“bug报告”。我在这里得到了同样的行为,R版本2.14.1(2011-12-22)。我在2.14.2中看到了同样的事情,不知道为什么会发生这种情况,但在发布到R-devel上之前,最好在最新的快照上测试它。他们不喜欢6个月前版本的R上的“bug报告”。我在这里得到了同样的行为,R版本2.14.1(2011-12-22)。我在2.14.2中看到了同样的事情。谢谢你Joshua,我希望我知道如何像你一样找到进入R基本代码的方法。我停在
print(as.matrix)
。@flodel:
print(as.matrix)
显示
usethod(“as.matrix”)
,然后我查看
方法(as.matrix)
。然后可以使用
print(as.matrix.data.frame)
查看data.frame方法。如果该方法恰好是“不可见的”,您可以使用
getAnywhere
(例如
getAnywhere(“as.matrix.dist”)
)。这些对我将来会很有帮助,感谢您的后续跟进Joshua。谢谢Joshua,我希望我能像您一样知道如何进入R的基本代码。我停在
print(as.matrix)
。@flodel:
print(as.matrix)
显示
usethod(“as.matrix”)
,然后我查看
方法(as.matrix)
。然后可以使用
print(as.matrix.data.frame)
查看data.frame方法。如果该方法恰好是“不可见的”,您可以使用
getAnywhere
(例如
getAnywhere(“as.matrix.dist”)
)。这些将对我将来非常有帮助,感谢您的后续跟进。