2012-05-22 21 views
10

मैं एक सीएसवी फ़ाइल पढ़ने की कोशिश कर रहा हूं जिसमें पहले कॉलम में बारकोड हैं, लेकिन जब आर इसे डेटा.फ्रेम में ले जाता है, तो यह "1665535004661" से "1.67E + 12" में परिवर्तित हो जाता है। क्या इस नंबर को एक पूर्णांक प्रारूप में संरक्षित करने का कोई तरीका है? मैंने "डबल" की कक्षा को असाइन करने का प्रयास किया, लेकिन यह काम नहीं किया, न ही "चरित्र" की कक्षा को असाइन किया। एक बार यह 1.67 ई +12 प्रारूप में है, इसे वापस एक पूर्णांक रिटर्न में बदलने के लिए किसी भी प्रयास को "167000000000"।बड़ी संख्या में

धन्यवाद, J--

उत्तर

12

यह एक "1.67E + 12 प्रारूप" में नहीं है, यह सिर्फ पूरी तरह चूक का उपयोग करके प्रिंट नहीं होंगे। आर इसे ठीक से पढ़ रहा है और पूरी संख्या वहां है।

x <- 1665535004661 
> x 
[1] 1.665535e+12 
> print(x, digits = 16) 
[1] 1665535004661 

देखें, संख्याएं सभी वहां थीं। जब तक आपके पास वास्तव में बड़ी संख्या में अंक नहीं हैं तब तक वे खो नहीं जाते हैं। आपके द्वारा लाए गए कार्यों पर छंटनी ठीक काम करेगी और आप नाम टाइप करके स्पष्ट रूप से अपने डेटा को देखने के लिए अंक विकल्प के साथ स्पष्ट रूप से प्रिंट() को कॉल कर सकते हैं।

+0

यह अनिवार्य रूप से 'विकल्प() 'के साथ चर्चा की गई विधि को ओवरराइड करता है। संदर्भ के एक बिंदु के रूप में, किसी को '? Print.default' में चेतावनी को पढ़ना और ध्यान देना चाहिए क्योंकि कार्यान्वयन के रूप में> = 16 अंक प्लेटफ़ॉर्म विशिष्ट समस्या बनने लगते हैं क्योंकि' sprintf() 'के कार्यान्वयन के आधार पर भिन्न होना शुरू होता है अंतर्निहित सी कोड। – Chase

+0

यदि आप विकल्प() का उपयोग करते हैं तो वही सच है। यह केवल एक आउटपुट डिफ़ॉल्ट है। मुझे लगता है कि अगर आप इसके जवाब में इसके बारे में स्पष्ट थे तो यह सबसे अच्छा होगा। जैसा कि यह अस्पष्ट है। इसे बेवकूफ पढ़ने की कोशिश कर रहा हूं, मुझे आश्चर्य है कि क्या अंक विकल्प बदलता है कि कितने अंक बनाए रखा जाता है, वे कैसे पढ़ते हैं? ... क्या? – John

+0

अच्छा बिंदु - इसके बारे में अधिक स्पष्ट होने के लिए मेरा उत्तर संपादित किया। यदि आपको जरूरी लगता है तो आगे बढ़ने के लिए स्वतंत्र महसूस करें। चीयर्स! - चेस – Chase

3

int64 पैकेज पर एक नज़र डालें: Bringing 64-bit data to R

+0

क्या इसे एक चरित्र के रूप में आयात करने का कोई तरीका है? मुझे इसके साथ गणित करने की आवश्यकता नहीं है, मुझे बस इसे हल करने की आवश्यकता है। – James

+0

x <- "1665535004661" –

10

टिप्पणियों में जो कुछ कहा है उस पर उठाकर, आप read.table() में colClasses निर्दिष्ट करके सीधे चरित्र के रूप में टेक्स्ट आयात कर सकते हैं। उदाहरण के लिए:

num <- "1665535004661" 
dat.char <- read.table(text = num, colClasses="character") 
str(dat.char) 
#------ 
'data.frame': 1 obs. of 1 variable: 
$ V1: chr "1665535004661" 
dat.char 
#------ 
      V1 
1 1665535004661 

वैकल्पिक रूप से (और अन्य उपयोगों के लिए), तो आपको options() तहत digits चर निर्दिष्ट कर सकते हैं। डिफ़ॉल्ट 7 अंक है और स्वीकार्य सीमा 1-22 है। स्पष्ट होने के लिए, इस विकल्प को किसी भी तरह से अंतर्निहित डेटा में परिवर्तन या परिवर्तन करने के लिए सेट करना, यह केवल मुद्रित होने पर स्क्रीन पर प्रदर्शित होने पर नियंत्रण करता है। ?options के लिए मदद पृष्ठ से:

controls the number of digits to print when printing numeric values. It is a suggestion only. 
Valid values are 1...22 with default 7. See the note in print.default about values greater than 
15. 

उदाहरण इस illustrating:

options(digits = 7) 
dat<- read.table(text = num) 

dat 
#------ 
      V1 
1 1.665535e+12 

options(digits = 22) 
dat 
#------ 
      V1 
1 1665535004661 

पूरी तरह से यह पता मांस के और मामलों के लिए खाते में करने के लिए जब एक वैश्विक सेटिंग की स्थापना बेहतर नहीं है, तो आप सीधे अंक निर्दिष्ट कर सकते हैं print(foo, digits = bar) पर एक तर्क के रूप में। आप इसके बारे में ?print.default के तहत और अधिक पढ़ सकते हैं। जॉन ने अपने जवाब में यही वर्णन किया है, इसलिए उस नवाचार को रोशन करने के लिए श्रेय उनके पास जाना चाहिए।

4

is.integer पेज से:

"नोट आर के कि वर्तमान कार्यान्वयन का उपयोग पूर्णांक वैक्टर के लिए 32-बिट पूर्णांक है, तो प्रदर्शनीय पूर्णांकों की सीमा के बारे में +/- 2 * 10^9 तक ही सीमित है ?

1665535004661L> 2 * 10^9 [1] सही

आप पैकेज Rmpfr चाहते हैं।

library(Rmpfr) 
x <- mpfr(15, precBits= 1024) 
2

चूंकि आप इस मूल्य पर अंकगणित नहीं कर रहे हैं, चरित्र उचित है। आप प्रत्येक कॉलम के लिए विभिन्न वर्गों को सेट करने के लिए colClasses तर्क का उपयोग कर सकते हैं, जो शायद सभी वर्णों का उपयोग करने से बेहतर है।

डेटा।सीएसवी:

a,b,c 
1001002003003004,2,3 

पढ़ें चरित्र है, तो पूर्णांकों:

x <- read.csv('test.csv',colClasses=c('character','integer','integer')) 
x 
       a b c 
1 1001002003003004 2 3 


mode(x$a) 
[1] "character" 

mode(x$b) 
[1] "numeric" 
1

जब आप read.csv कर रहे हैं तो आप अंकों के तर्कों का उपयोग कर सकते हैं। उदाहरण के लिए:

read.csv(x, sep = ";", numerals = c("no.loss")) Where x is your data. 

यह लंबे पूर्णांक मूल्य को बरकरार रखता है और जब आप डेटा आयात नहीं उनके प्रतिनिधित्व के साथ गड़बड़ नहीं है।

संबंधित मुद्दे