簡體   English   中英

如何將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”類屬性(加上一些魔法使它們打印並正確算術)被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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM