【问题标题】:How to convert a data frame of integer64 values to be a matrix?如何将 integer64 值的数据框转换为矩阵?
【发布时间】: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) &lt;- "integer64",因为这会改变矩阵对象的类而不是它的内容。

同样,mode(m) &lt;- "integer64" 给出错误答案,typeof(m) &lt;- "integer64"storage.mode(m) &lt;- "integer64" 抛出错误。

当然,我可以通过将列转换为双倍 (dfr$x &lt;- as.double(dfr$x)) 来规避这个问题,但感觉应该有一种方法可以正确地做到这一点。

如何获得integer64 值的矩阵?

【问题讨论】:

  • 也许您正走在一条黑暗的道路上:除非您将所有 函数 都提供给矩阵以拥有 integer64 方法,否则您最终还是会在某个时候转换为双打。 bit64 包是否有一组适当的方法,是否有一些 as.matrix64 工具?如果不是,您不妨转换为 double 或使用 gmpRmpfr 包。 ETA:“矩阵”这个词甚至没有出现在bit64 的帮助文件中,所以我认为你必须坚持使用数据框和可用的方法。
  • @CarlWitthoft 但是哦,看看闪亮的球在黑暗、纠结的树林中弹跳,没有返回的希望,也许我应该去追逐它。

标签: r bit64


【解决方案1】:

对于原始向量,直接分配dim 属性似乎有效:

> z <- as.integer64(1:10)
> z
integer64
 [1] 1  2  3  4  5  6  7  8  9  10
> dim(z) <- c(10, 1)
> z
integer64
      [,1]
 [1,] 1   
 [2,] 2   
 [3,] 3   
 [4,] 4   
 [5,] 5   
 [6,] 6   
 [7,] 7   
 [8,] 8   
 [9,] 9   
[10,] 10  

对于数据框,cbinding 列也可以:

> df <- data.frame(x=as.integer64(1:5), y=as.integer64(6:10))
> df
  x  y
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10
> cbind(df$x, df$y)
integer64
     [,1] [,2]
[1,] 1    6   
[2,] 2    7   
[3,] 3    8   
[4,] 4    9   
[5,] 5    10  

因此,对于任意数量的列,do.call 是要走的路:

> do.call(cbind, df)
integer64
     x y 
[1,] 1 6 
[2,] 2 7 
[3,] 3 8 
[4,] 4 9 
[5,] 5 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2020-12-09
    • 2020-07-05
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多