我有一个数据框,它完全由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"
引发错误。
当然,我可以通过将列转换为double(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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句