我的数据框完全由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
值存储为数字值,其中包含&#34;整数64&#34;被as.matrix
剥离的类属性(加上一些使它们打印并正确算术的魔法)。
我不能只做class(m) <- "integer64"
,因为这会改变矩阵对象的类而不是其内容。
同样,mode(m) <- "integer64"
给出错误答案,typeof(m) <- "integer64"
和storage.mode(m) <- "integer64"
抛出错误。
当然,我可以通过将列转换为double(dfr$x <- as.double(dfr$x)
)来解决问题,但感觉应该有一种方法可以正确地执行此操作。
如何获得integer64
值的矩阵?
答案 0 :(得分:4)
对于原始矢量,直接分配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