【发布时间】:2015-02-01 11:43:00
【问题描述】:
我有一个完全由 integer64 列组成的数据框,我想将其转换为矩阵。
library(bit64)
(dfr <- data.frame(x = as.integer64(10^(9:18))))
## x
## 1 1000000000
## 2 10000000000
## 3 100000000000
## 4 1000000000000
## 5 10000000000000
## 6 100000000000000
## 7 1000000000000000
## 8 10000000000000000
## 9 100000000000000000
## 10 1000000000000000000
很遗憾,as.matrix 没有给出正确答案。
(m <- as.matrix(dfr))
## x
## [1,] 4.940656e-315
## [2,] 4.940656e-314
## [3,] 4.940656e-313
## [4,] 4.940656e-312
## [5,] 4.940656e-311
## [6,] 4.940656e-310
## [7,] 4.940656e-309
## [8,] 5.431165e-308
## [9,] 5.620396e-302
## [10,] 7.832953e-242
问题似乎在于integer64 值被存储为具有“integer64”类属性的数值(加上一些使它们正确打印和执行算术的魔法)被as.matrix 剥离。
我不能只做class(m) <- "integer64",因为这会改变矩阵对象的类而不是它的内容。
同样,mode(m) <- "integer64" 给出错误答案,typeof(m) <- "integer64" 和 storage.mode(m) <- "integer64" 抛出错误。
当然,我可以通过将列转换为双倍 (dfr$x <- as.double(dfr$x)) 来规避这个问题,但感觉应该有一种方法可以正确地做到这一点。
如何获得integer64 值的矩阵?
【问题讨论】:
-
也许您正走在一条黑暗的道路上:除非您将所有 函数 都提供给矩阵以拥有
integer64方法,否则您最终还是会在某个时候转换为双打。bit64包是否有一组适当的方法,是否有一些as.matrix64工具?如果不是,您不妨转换为 double 或使用gmp和Rmpfr包。 ETA:“矩阵”这个词甚至没有出现在bit64的帮助文件中,所以我认为你必须坚持使用数据框和可用的方法。 -
@CarlWitthoft 但是哦,看看闪亮的球在黑暗、纠结的树林中弹跳,没有返回的希望,也许我应该去追逐它。