2015-05-20 2 views
10

में वैज्ञानिक नोटेशन बंद करें मैं जनगणना डेटा को संसाधित करने के लिए वास्तव में लंबे संख्यात्मक जीईओआईडी का उपयोग करता हूं जो जनगणना डेटा को संसाधित करने के लिए आर का उपयोग कर रहा हूं। मुझे जिस मुद्दे का सामना करना पड़ रहा है वह है write_csv (readr पैकेज से) संसाधित डेटा लिखते समय यह वैज्ञानिक नोटेशन में इन जीईओआईडी लिख रहा है। क्या इस से निकाल पाने के लिए कोई तरीका है?readr: write_csv

नोट: मैं scipen विकल्प को पर्याप्त रूप से बड़े मूल्य पर सेट करके आर कंसोल पर वैज्ञानिक नोटेशन डिस्प्ले टॉगल करने में सक्षम हूं। लेकिन यह सेटिंग readr लाइब्रेरी में विस्तारित प्रतीत नहीं होती है।

library(dplyr) 
library(readr) # which is the package with write_csv 
(tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))) 
Source: local data frame [6 x 1] 

      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

यह वही मैं वर्तमान में हो रही है:

यहाँ एक खिलौना डाटासेट है।

GEOID 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
+0

क्या आप समस्या को स्पष्ट करने के लिए एक छोटा [पुनरुत्पादित उदाहरण] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) तैयार कर सकते हैं? क्या आप वाकई उन संख्याओं के साथ व्यवहार करना चाहते हैं? शायद उन्हें चरित्र/कारक मूल्यों में परिवर्तित करें? – MrFlick

+0

मैं संख्यात्मक प्रकार का उपयोग करना जारी रखना चाहता हूं। फाइल लिखने के लिए वैज्ञानिक नोटेशन को दबाने के बारे में जानना अच्छा होगा। – sriramn

उत्तर

1

मैं तुम्हें

write.csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

के बजाय

का उपयोग करते हैं मैं खोलने test.csv खुलता सुझाव है: मैं एक तरह से ऊपर के रूप में ही नंबर प्राप्त करने के लिए देख रहा हूँ एक्सेल में फ़ाइल। एक्सेल इसे वैज्ञानिक नोटेशन में बदल देता है। जब मैं सही क्लिक करता हूं और नोटपैड के साथ खोलता हूं तो यह अच्छा लगता है और मैं वैज्ञानिक संख्या के बिना मूल संख्या देखता हूं।

+0

धन्यवाद! मैं 'readr' पैकेज में माइग्रेट करने की कोशिश कर रहा हूं और देख रहा हूं कि मैं उस पुस्तकालय में इसे कैसे कर सकता हूं। – sriramn

3

यह शायद चरित्र मूल्यों का उपयोग करने के लिए सुरक्षित हो जाएगा:

X <- tbl_df(data.frame(GEOID = as.character(seq(from=60150001022000, to=60150001022005)))) 

write_csv(X, "test.csv") 

यह write_csv समारोह चरित्र मूल्यों के लिए इसके उत्पादन के कुछ विवश करता है कि थोड़ा विडंबना है, लेकिन सांख्यिक स्तंभ नहीं। केवल तभी जब कोई कॉलम is.object परीक्षा उत्तीर्ण करता है तो उसे सहारा दिया जाएगा। फेंकने के लिए एक स्विच नहीं दिखता है जो अधिकतम सटीकता को संरक्षित रखेगा। write.table और इसके संतान write.csv फ़ंक्शंस में कई स्विच हैं जो उद्धरण और अन्य सेटिंग्स के दमन की अनुमति देते हैं जो आउटपुट को सिलाई करने की अनुमति देते हैं लेकिन write_csv में बहुत कम है।

आप write_csv को यह सोचने में ट्रिक कर सकते हैं कि एक संख्यात्मक कॉलम कुछ और जटिल है और इसके परिणामस्वरूप as.character आउटपुट होता है, हालांकि उद्धरण के साथ।

class(X[[1]])<- c("num", "numeric") 
vapply(X, is.object, logical(1)) 
#GEOID 
# TRUE 

write_csv(X, "") 
#[1] #"\"GEOID\"\n\"60150001022000\"\n\"60150001022001\"\n\"60150001022002\"\n\"60150001022003\"\n\"60150001022004\"\n\"60150001022005\"\n" 

सर्वोत्तम प्रथाओं मैं यह कहा गया कि आईडी-चर की अपनी पसंद से सहमत नहीं है की बात है सांख्यिक रहते हैं। एक वस्तु के लिए उस भंडारण मोड पर बहुत अधिक हिंसा लागू की जा सकती है। आपको आईडी-वेरिएबल के लिए अंकगणितीय परिचालनों की आवश्यकता नहीं है।

+0

धन्यवाद। लेकिन मैं सोच रहा था कि संख्यात्मक प्रकार के व्यवहार को बंद करने का कोई तरीका है या नहीं? – sriramn

1

उपयोग bit64, यह है, यह सही डेटाप्रकार आवंटित करेगा 64 बिट पूर्णांकों

library(dplyr) 
library(readr) 
options(digits = 22) 
tbl_df <- data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)) 
> tbl_df 
      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

library(bit64) 
tbl_df$GEOID <- as.integer64(tbl_df$GEOID) 
write_csv(tbl_df,'test.csv') 

आप आर में फिर से इस डेटा को पढ़ने तो के लिए वैक्टर के लिए एक S3 वर्ग है।

dfr <- read_csv('test.csv') 
> dfr 
Source: local data frame [6 x 1] 

      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

> str(tbl_df) 
'data.frame': 6 obs. of 1 variable: 
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 6 obs. of 1 variable: 
$ GEOID: num 6.02e+13 6.02e+13 6.02e+13 6.02e+13 6.02e+13 ... 

उम्मीद है कि इससे मदद मिलती है। मैंने एक पाठ संपादक में सीएसवी खोला, संख्याएं उनके चारों ओर थीं। लेकिन यह अभी भी काम किया है।

3

मैं नहीं बल्कि, int टाइप करने के लिए, क्योंकि यदि ऐसा है तो write_* वैज्ञानिक संख्या एन्कोडिंग अब और का उपयोग नहीं होगा इस तरह के कॉलम recoding सुझाव देना चाहेंगे।एक पास के सारे सांख्यिक स्तंभ परिवर्तित करने के लिए (उदाहरण के लिए यदि आप एक मायने रखता है मैट्रिक्स के साथ काम कर रहे हैं), कर सकता है:

require(dplyr)  
tbl_df = mutate_if(tbl_df, is.numeric, as.integer) 
4

मैं write_csv में वैज्ञानिक अंकन के नियंत्रण में सुधार करने के एक पैच के साथ एक pull request लिखा था।

इस पैच के साथ आपको int_use_scientific=FALSEwrite_csv में तर्क होगा जो आपकी समस्या का समाधान करेगा। उम्मीद है कि अंततः इसे विलय कर दिया जाएगा।