[英]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”類屬性(加上一些魔法使它們打印並正確算術)被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
the columns也有效:
> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.