2015-02-01 6 views
8

मेरे पास एक डेटा फ्रेम है जिसमें पूरी तरह से integer64 कॉलम शामिल हैं जिन्हें मैं एक मैट्रिक्स में परिवर्तित करना चाहता हूं।एक मैट्रिक्स होने के लिए 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 

समस्या (उन्हें प्रिंट बनाने के लिए और गणित सही ढंग से करने के लिए प्लस कुछ जादू) as.matrix द्वारा छीन लिया जाता है कि कि integer64 मूल्यों एक "integer64" वर्ग विशेषता के साथ संख्यात्मक मान के रूप में जमा हो जाती है हो रहा है।

मैं केवल class(m) <- "integer64" नहीं कर सकता क्योंकि यह मैट्रिक्स ऑब्जेक्ट की कक्षा को इसकी सामग्री में परिवर्तित नहीं करता है।

इसी तरह, mode(m) <- "integer64" गलत उत्तर देता है और typeof(m) <- "integer64" और storage.mode(m) <- "integer64" त्रुटियां फेंक देता है।

बेशक मैं कॉलम को डबल (dfr$x <- as.double(dfr$x)) में परिवर्तित करके समस्या को बाधित कर सकता हूं लेकिन ऐसा लगता है कि इसे ठीक से करने का एक तरीका होना चाहिए।

मैं integer64 मानों का मैट्रिक्स कैसे प्राप्त कर सकता हूं?

+4

शायद आप नीचे जा रहे हैं एक अंधेरा पथ: जब तक कि सभी * फ़ंक्शंस * आप 'matger64' विधियों के लिए अपने मैट्रिक्स को खिलाने जा रहे हैं, तब भी आप किसी बिंदु पर युगल में परिवर्तित हो जाएंगे। क्या 'bit64' पैकेज में उचित विधियों का संग्रह है, और उस मामले के लिए इसमें कुछ 'as.matrix64' उपकरण है? यदि नहीं, तो आप डबल या शायद 'gmp' और' rmpfr' संकुल का उपयोग कर सकते हैं। ईटीए: शब्द "मैट्रिक्स" भी 'बिट 64' के लिए सहायता फ़ाइल में प्रकट नहीं होता है, इसलिए मुझे लगता है कि आपको डेटाफ्रेम और इसके लिए उपलब्ध विधियों के साथ रहना होगा। –

+3

@ करलविथथॉफ्ट लेकिन ओह चमकदार गेंद को अंधेरे, उलझन वाले जंगल में उछालते हुए देखते हैं, जहां से वापसी की कोई उम्मीद नहीं है, शायद मुझे इसका पीछा करना चाहिए। –

उत्तर

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 कॉलम ing भी काम करता है:

> 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 
संबंधित मुद्दे