2015-09-01 9 views
20

मेरे डेटासेट के हिस्से के रूप में, कॉलम में से एक 24 अंकों की संख्या की श्रृंखला है।एक वर्ण स्ट्रिंग के रूप में लंबी संख्या

उदाहरण:

bigonumber <- 429382748394831049284934 

मैं इसे या तो data.table::fread या read.csv का उपयोग करते समय आयात करते हैं, इसे घातीय प्रारूप में संख्यात्मक रूप से पता चलता (जैसे: 4.293827e + 23)।

options(digits=...) काम नहीं करेगा क्योंकि यह संख्या 22 अंकों से अधिक है।

जब मैं कर

as.character(bigonumber) 

मैं क्या मिलता है "4.29382748394831e + 23"

वहाँ एक रास्ता bigonumber एक चरित्र स्ट्रिंग में बदल जाती है और पात्रों के रूप में अंकों के सभी दिखाने पाने के लिए है? मुझे इस पर कोई गणित करने की आवश्यकता नहीं है, लेकिन मुझे इसके खिलाफ खोज करने की आवश्यकता है और dplyr इसमें शामिल हो जाता है।

मुझे आयात के बाद इसकी आवश्यकता है, क्योंकि कॉलम संख्या महीने से महीने में भिन्न होती है।

(हां, सही दुनिया में, मेरा अपस्ट्रीम डेटा प्रदाता लंबे समय की बजाय हैश का उपयोग करेगा और कॉलम की एक स्थिर संख्या जो हर महीने एक ही रहती है, लेकिन मुझे उनको निर्देशित नहीं करना है।)

+1

'fread' और' read.csv' दोनों शामिल हैं और समझाने 'colClasses' –

उत्तर

15

आप अपने फ्रेड या read.csv कथन पर colClasses निर्दिष्ट कर सकते हैं।

bignums 
429382748394831049284934 
429382748394831049284935 
429382748394831049284936 
429382748394831049284937 
429382748394831049284938 
429382748394831049284939 

bignums <- read.csv("~/Desktop/bignums.txt", sep="", colClasses = 'character') 
+2

यह सही उत्तर है। 'colclasses' भी 'fread' के लिए काम करता है। –

+3

आप केवल एक कॉलम रखने के लिए 'read.csv ("~/डेस्कटॉप/bignums.txt", sep = "", colClasses = c (bignums =' character ')) भी कर सकते हैं। – Marek

9

आप

options(scipen=999) 

साथ वैज्ञानिक संकेतन को दबाने कर सकते हैं नंबर तो

bigonumber <- 429382748394831049284934 

परिभाषित, तो आप इसे एक स्ट्रिंग में तब्दील कर सकते हैं:

big.o.string <- as.character(bigonumber) 

दुर्भाग्य से, यह काम नहीं करता है क्योंकि आर एक डबल, जिससे खोने परिशुद्धता के लिए संख्या में कनवर्ट करता है:

#[1] "429382748394831019507712" 

पिछले अंक, संरक्षित नहीं कर रहे हैं के रूप में @SabDeM से बताया। यहां तक ​​कि

options(digits=22) 

मदद नहीं करता है, और किसी भी मामले में 22 सबसे बड़ी संख्या है जो अनुमति है; और आपके मामले में 24 अंक हैं। तो ऐसा लगता है कि आपको डेटा को चरित्र या कारक के रूप में सीधे पढ़ना होगा। महान उत्तरों पोस्ट किए गए हैं यह दिखाते हुए कि यह कैसे प्राप्त किया जा सकता है।

एक साइड नोट के रूप में, gmp नामक एक पैकेज है जो मनमाने ढंग से बड़े पूर्णांक संख्याओं का उपयोग करने की अनुमति देता है। हालांकि, एक पकड़ है: उन्हें अक्षर के रूप में पढ़ना होगा (फिर से, आर के आंतरिक रूपांतरण को डबल में रोकने के लिए)।

library(gmp) 
bigonumber <- as.bigz("429382748394831049284934") 
> bigonumber 
Big Integer ('bigz') : 
[1] 429382748394831049284934 
> class(bigonumber) 
[1] "bigz" 

लाभ यह है कि आप वास्तव में इन प्रविष्टियों को संख्याओं के रूप में देख सकते हैं और सभी अंकों को संरक्षित करते समय गणना कर सकते हैं।

> bigonumber * 2 
#Big Integer ('bigz') : 
#[1] 858765496789662098569868 

इस पैकेज और मेरा उत्तर यहाँ अपनी समस्या को हल नहीं हो सकता, क्योंकि सीधे संख्या में पढ़ने के पात्रों के रूप में अपने लक्ष्य को प्राप्त करने के लिए एक आसान तरीका है, लेकिन मुझे लगता है मैं उपयोगकर्ताओं के लिए एक जानकारी के रूप में वैसे भी इस पोस्ट कर सकता है सोचा था कि जो हो सकता है 22 से अधिक अंकों के साथ बड़े पूर्णांक का उपयोग करने की आवश्यकता है।

3

बड़े नंबर पर digest::digest का उपयोग करें ताकि आप स्वयं के एमडी 5 हैश उत्पन्न कर सकें?

bigonumber <- 429382748394831049284934 
hash_big <- digest::digest(bigonumber) 
hash_big 
# "e47e7d8a9e1b7d74af6a492bf4f27193" 
+0

कि सुपर स्वादिष्ट है?। मुझे लगता है कि आगे बढ़ना मैं इसे एक नए कॉलम के रूप में करूँगा। – ClintWeathers

+1

लेकिन यह केवल तभी काम करता है जब आप संख्यात्मक के रूप में बहुत अधिक अंक संख्या को स्टोर करने की कोशिश करके परिशुद्धता खो चुके हैं ... –

2

फ़ाइल को पढ़ने के लिए "स्कैन" का उपयोग करें - "क्या" पैरामीटर आपको प्रत्येक कॉलम के इनपुट प्रकार को परिभाषित करने देता है।

2

यदि आप संख्याओं के रूप में संख्या चाहते हैं तो आप सभी मानों को प्रिंट नहीं कर सकते हैं। digits विकल्प अधिकतम 22 अंक की अनुमति देता है। रेंज 1 से 22 तक है। यह print.default विधि का उपयोग करती है। आप इसे इसके साथ सेट कर सकते हैं:

options(digits = 22) 

यहां तक ​​कि इन विकल्पों के साथ, संख्याएं बदलेगी। मैं अनदेखा करता हूं कि ऐसा क्यों होता है, संभवतः इस तथ्य के कारण कि जिस वस्तु को आप मुद्रित करने वाले हैं (संख्या) अंकों की अनुमत राशि से अधिक है और इसलिए आर कुछ अजीब चीजें करता है। मैं इसके बारे में जांच करूंगा।

2

मैंने इसे अपना जवाब पोस्ट करने से पहले देखा, लेकिन अब इसे यहां न देखें।

एक बड़ा मूल्य को options(scipen) सेट इतना है कि वहाँ कोई काट-छांट यह है:?

options(scipen = 999) 
bigonumber <- 429382748394831049284934 
bigonumber 
# [1] 429382748394831019507712 
as.character(bigonumber) 
# [1] "429382748394831019507712" 
+0

यह कुछ अच्छे विकल्पों में से सबसे अच्छा लगता है। धन्यवाद! ईटीए: एचआरएमएच। आखिरी कुछ वास्तव में गलत हैं। कोई विचार नहीं कि इसका कारण क्या है। – ClintWeathers

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