如何将 integer64 值的数据框转换为矩阵?
How to convert a data frame of integer64 values to be a matrix?
我有一个完全由 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" class 属性的数值(加上一些使它们正确打印和计算的魔法)被 as.matrix
.
剥离
我不能只做 class(m) <- "integer64"
因为这会改变矩阵对象的 class 而不是它的内容。
同样,mode(m) <- "integer64"
给出错误答案,typeof(m) <- "integer64"
和 storage.mode(m) <- "integer64"
抛出错误。
当然,我可以通过将列转换为双列 (dfr$x <- as.double(dfr$x)
) 来规避这个问题,但感觉应该有一种方法可以正确地做到这一点。
如何获得 integer64
个值的矩阵?
对于原始向量,直接分配 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
对于数据框,cbind
对列也有效:
> 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
我有一个完全由 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" class 属性的数值(加上一些使它们正确打印和计算的魔法)被 as.matrix
.
我不能只做 class(m) <- "integer64"
因为这会改变矩阵对象的 class 而不是它的内容。
同样,mode(m) <- "integer64"
给出错误答案,typeof(m) <- "integer64"
和 storage.mode(m) <- "integer64"
抛出错误。
当然,我可以通过将列转换为双列 (dfr$x <- as.double(dfr$x)
) 来规避这个问题,但感觉应该有一种方法可以正确地做到这一点。
如何获得 integer64
个值的矩阵?
对于原始向量,直接分配 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
对于数据框,cbind
对列也有效:
> 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