स्वरूपण दशमलव स्थानों में आर


264

मेरे पास एक संख्या है, उदाहरण के लिए 1.128347132904321674821, जो मैं केवल दो दशमलव स्थानों के रूप में दिखाना चाहता हूं जब स्क्रीन पर आउटपुट होता है (या फ़ाइल में लिखा जाता है)। किसी से ऐसा कैसे संभव है?

x <- 1.128347132904321674821

संपादित करें:

का उपयोग:

options(digits=2)

एक संभावित उत्तर के रूप में सुझाया गया है। क्या एक समय के उपयोग के लिए स्क्रिप्ट के भीतर इसे निर्दिष्ट करने का कोई तरीका है? जब मैं इसे अपनी स्क्रिप्ट में जोड़ता हूं तो यह कुछ अलग करने के लिए नहीं लगता है और मैं प्रत्येक नंबर को प्रारूपित करने के लिए बहुत कुछ फिर से टाइप करने में दिलचस्पी नहीं रखता हूं (मैं एक बहुत बड़ी रिपोर्ट को स्वचालित कर रहा हूं)।

-

उत्तर: गोल (x, अंक = 2)


1
संबंधित प्रश्न: stackoverflow.com/questions/2287616/…
शेन 20

यदि कोई विकल्प (अंक = 4) का उपयोग करता है, तो वह गणना को 4 अंकों तक सीमित नहीं करता है, क्या यह करता है? उस स्थिति में यह कार्यक्रमों को बहुत कम सटीक बनाएगा। जब यह मुद्रित होता है, तो यह केवल संख्या को प्रभावित करता है?
१०:२० बजे माइकज

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.विकल्पों से यह केवल उत्पादन पर प्रभाव डालता है।
ब्रैंडन बर्टेल्सन

ध्यान दें कि round(23, digits=2)प्रिंट होगा 23और नहीं 23.00। यदि आप उत्तरार्द्ध चाहते हैं, तो stackoverflow.com/a/12135122/180892 पर
जेरोमे एंग्लीम

4
@PaHHurleyuk, मुझे लगता है कि पुस्तकालयों की न्यूनतम संख्या का उपयोग करने के लिए प्रोग्रामिंग में अच्छा अभ्यास है। कोई व्यक्ति जो प्रत्येक तुच्छ आवश्यकता के लिए एक अलग पुस्तकालय का उपयोग करता है, आमतौर पर एक गड़बड़, बड़ी फ़ाइलों, पोर्टेबिलिटी मुद्दों, आदि के साथ समाप्त होता है
रॉडरिगो

जवाबों:


381

पृष्ठभूमि: कुछ उत्तर इस पृष्ठ पर सुझाव (जैसे, signif, options(digits=...)) गारंटी नहीं देते कि दशमलव की एक निश्चित संख्या में एक मनमाना संख्या के लिए प्रदर्शित होते हैं। मुझे लगता है कि यह आर में एक डिजाइन सुविधा है जिसके तहत अच्छे वैज्ञानिक अभ्यास में " महत्वपूर्ण आंकड़ों " के सिद्धांतों के आधार पर निश्चित संख्या में अंक दिखाना शामिल है । हालाँकि, कई डोमेन में (जैसे, APA शैली , व्यवसाय रिपोर्ट) स्वरूपण आवश्यकताएं निर्धारित करती हैं कि कुछ निश्चित दशमलव स्थान प्रदर्शित किए जाते हैं। यह अक्सर महत्वपूर्ण आंकड़ों के साथ संबंधित होने के बजाय स्थिरता और मानकीकरण उद्देश्यों के लिए किया जाता है।

समाधान :

निम्न कोड संख्या के लिए ठीक दो दशमलव स्थानों को दर्शाता है x

format(round(x, 2), nsmall = 2)

उदाहरण के लिए:

format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"

एक अधिक सामान्य कार्य निम्नानुसार है जहां xसंख्या है और kदिखाने के लिए दशमलव की संख्या है। trimwsकिसी भी प्रमुख श्वेत स्थान को हटा देता है जो यदि आपके पास संख्याओं का वेक्टर है तो उपयोगी हो सकता है।

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))

उदाहरण के लिए,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"

4
+1 केवल मेरे लिए काम करने वाले उत्तर, सही ढंग से प्रिंट 0.0001करता है0.00
थॉमस डे

7
यह हमेशा मुझे परेशान करता है कि कैसे काम करता है format()और prettyNum()संख्याओं को वर्णों में बदल देता है। आप इसे कैसे संबोधित करेंगे?
वाल्डिर लियोनसियो

प्रकट होने वाले उद्धरणों के साथ क्या है?
एफ। वेबर

2
@JeromyAnglim मैं ध्यान देता हूं कि ऊपर दिए गए समाधान में दशमलव के सामने वर्णों की संख्या को ठीक करने का एक संभावित किनारे का नुकसान है, उदाहरण के लिए format(c(10, 1), nsmall=1)पैदावार "10.0" " 1.0"(1.0 के सामने अग्रणी स्थान पर ध्यान दें। जबकि, sprintf()फ़ंक्शन वायसर प्रारूपण की गारंटी देता है। दशमलव के दोनों ओर, उदाहरण sprintf(c(10,1), fmt = '%#.1f')के लिए उस pesky अग्रणी स्थान से छुटकारा मिलता है और वापस लौटता है "10.0" "1.0"
निकोलस जी रेइच

1
अग्रणी रिक्त स्थान formatएक स्तंभ में उपयोग किए जाने पर दशमलव बिंदु को संरेखित करने के लिए डिज़ाइन की गई विशेषता है ।
निवासी

34

आप अपनी xइच्छानुसार एक संख्या को कह सकते हैं , दशमलव स्थानों तक कह सकते हैं। यहाँ xकई दशमलव स्थानों के साथ एक संख्या है। मान लें कि हम इस संख्या के 8 दशमलव स्थानों को दिखाना चाहते हैं:

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"

यहां format="f"सामान्य दशमलव स्थानों में फ़्लोटिंग संख्या दी गई है, xxx.xxx कहते हैं, और digitsअंकों की संख्या को निर्दिष्ट करता है। इसके विपरीत, यदि आप एक पूर्णांक प्राप्त करना चाहते हैं, तो आप प्रदर्शित करेंगे format="d"(बहुत पसंद sprintf)।


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

आप में से कोई भी इस पर मदद कर सकता है? stackoverflow.com/q/53279593/5224236
gpier

24

आप मेरे पैकेज को योग्‍य रूप से आज़मा सकते हैं ।

> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13

अच्छी बात यह है, xअभी भी एक संख्यात्मक वेक्टर है और आप एक ही स्वरूपण के साथ अधिक गणना कर सकते हैं।

> x + 1
[1] 2.13

इससे भी बेहतर, अंक खो नहीं रहे हैं, आप किसी भी समय अधिक अंकों के साथ सुधार कर सकते हैं :)

> formattable(x, digits = 6, format = "f")
[1] 1.128347

ऐसी छोटी छोटी चुभन मुझे पूरी सुबह चुभती है। किसी कारण से आर केवल कुछ कॉलम के लिए प्रदर्शन को गोल करेगा। मुझे इस सुधार की आवश्यकता थी क्योंकि मुझे उन स्तंभों पर भी गणना करनी थी। यह काम। धन्यवाद !
thethakuri

मुझे किसी भी बेसआर फ़ंक्शंस की तुलना में फॉर्मैटेबल पसंद है। इसका सबसे बड़ा फायदा वैरिएबल को न्यूमेरिक के रूप में बरकरार रखता है।
लाजरस थर्स्टन

22

2 दशमलव स्थानों के लिए मान लें कि आप शून्य को पीछे रखना चाहते हैं

sprintf(5.5, fmt = '%#.2f')

जो देता है

[1] "5.50"

जैसा कि @mpag नीचे उल्लेख करता है, ऐसा लगता है कि R कभी-कभी इस के साथ अनपेक्षित मान दे सकता है और गोल विधि जैसे स्प्रिंटफ (5.5550, fmt = '% # 2f') 5.55 देता है, 5.56 नहीं।


1
हालांकि, स्प्रिंटफ राउंड, स्प्रिंटफ (5.5550, fmt = '% #। 2f') थोड़ा अप्रत्याशित परिणाम देता है: 5.55। स्प्रिंटफ (5.555000000001, fmt = '% # 2f') 5.56 देता है। यह R में गोलाई के साथ एक सामान्य "मुद्दा" प्रतीत होता है, क्योंकि गोल, nsmall विधि समान है।
मपग

धन्यवाद @mpag, मुझे नहीं पता था कि R ने सीमाओं पर गोल करने के साथ संघर्ष किया है, मैंने इसे केवल 5.565 के साथ आज़माया है जो राउंड अप करता है, जबकि 5.545 राउंड नीचे। मुझे लगता है कि यह वह तरीका है जो वे फ्लोटिंग पॉइंट अपर्चर संभाल रहे हैं। मुझे नहीं लगता कि मैंने इस व्यवहार को अन्य भाषाओं में देखा है जिसका मुझे मतलब है कि उनके पास एक अंतर्निर्मित वर्कअराउंड है
मार्क एडम्सन

मुझे लगता है कि वे जानबूझकर सटीक की डिग्री में सीमित मान मान रहे हैं। वे अनुमान लगा रहे हैं कि 5.555 का मान वास्तव में 5.5546 के 5.55 के रूप में "वास्तविक" मान के परिणामस्वरूप है। हालाँकि, यदि आप उस तरह के राउंडिंग गेम को जारी रखते हैं, तो 5.444445 एक समय में एक अंक करने पर "6" हो सकता है। लेकिन आप सही हो सकते हैं कि यह 5.55 से कम या उससे अधिक के द्विआधारी प्रतिनिधित्व का मामला हो सकता है।
मप्र

हाँ, मुझे लगता है कि अगर यह जानबूझकर होता तो यह 5.565 और 5.545 के बीच भी सुसंगत होता। 'यादृच्छिकता' मुझे पता चलता है कि यह एक फ्लोटिंग पॉइंट प्रतिनिधित्व वाली बात है।
मार्क एडम्सन

आप में से कोई भी इस पर मदद कर सकता है? stackoverflow.com/q/53279593/5224236
gpier

8

ऐसा कुछ :

options(digits=2)

अंकों के विकल्प की परिभाषा:

digits: controls the number of digits to print when printing numeric values.

क्या स्क्रिप्ट चलाते समय इसे गतिशील रूप से सेट करने का कोई तरीका है?
ब्रैंडन बर्टेल्सन

यह आर कंसोल के भीतर आउटपुट के लिए काम करता है, लेकिन मेरी स्क्रिप्ट के भीतर काम नहीं करता है (वे अभी भी .1289273982 के साथ बाहर आते हैं)
ब्रेंडन

1
मुझे एक अजीब व्यवहार मिलता है, digitsविकल्प दशमलव के बाद अंकों की संख्या निर्धारित नहीं करता है। उदाहरण के लिए, जब मैं विकल्प (अंक = 2) सेट करता हूं, तो 7.25 के परिणाम को प्रिंट करते हुए 7.2, 1234.25 के आउटपुट में 1234 हो जाता है, और 0.25 0.25 रह जाता है। क्या इसके साथ कोई अन्य विकल्प है?
मैक्सिम.के।

8

फ़ंक्शंस सुंदरम, प्रारूप की जाँच करें

शून्य (उदाहरण के लिए 123.1240) का उपयोग करना है sprintf(x, fmt='%#.4g')


@ ४२ मैं सीखने की वकालत करूँगा sprintf, यह मूल रूप से प्रारूपण के लिए एक ढाँचा है
जांगकोरकी २४'१६ को advoc:

1
@jangorecki मुझे आपकी बात पर यकीन नहीं है। मैंने (5+ साल पहले) एक वर्तनी सुधार का सुझाव दिया था।
IRTFM

@ ४२ मैं तुझसे शिकायत करता हूं fmt, माफ करना!
जंगोरकी

मुझे लगता है कि ओपी निश्चित अंकों के बजाय निश्चित दशमलव स्थानों के बाद है। ऐसा लगता है कि gआपके उत्तर में निर्धारित अंकों के लिए है, fबेहतर काम करता है।
मार्क एडम्सन

5

यदि आप निश्चित अंकों के लिए महत्वपूर्ण अंकों को प्राथमिकता देते हैं, तो साइनिफ कमांड उपयोगी हो सकती है:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300

1
धन्यवाद पॉल। ये दोनों बिल्कुल वैसा नहीं था जैसा मैं ढूंढ रहा था, लेकिन सिगनिफ़ ने मुझे गोल () की ओर ले गया, जो वास्तव में मेरी ज़रूरत थी। चीयर्स,
ब्रैंडन बर्टेल्सन

34
Error: could not find function "fixed"
थॉमस डे

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

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

@JeromyAnglim हम कैसे तय करते हैं कि जब हम 3sf चाहते हैं? कभी-कभी यह मुझे 3sf, अन्य समय 4sf आदि देता है, हम इसे कैसे ठीक करते हैं?
क्रिस्चौंड 7

4

फ़ंक्शन formatC()का उपयोग संख्या को दो दशमलव स्थानों पर प्रारूपित करने के लिए किया जा सकता है। दो दशमलव स्थान इस फ़ंक्शन द्वारा दिए गए हैं, तब भी जब परिणामी मानों में अनुगामी शून्य शामिल हैं।


3

मैं इस संस्करण का उपयोग बल प्रिंट K दशमलव स्थानों के लिए कर रहा हूँ:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)

2

ध्यान दें कि R में संख्यात्मक वस्तुएं दोहरी परिशुद्धता के साथ संग्रहीत हैं , जो आपको (मोटे तौर पर) परिशुद्धता के 16 दशमलव अंक देती हैं - बाकी शोर होगा। मैं अनुदान देता हूं कि ऊपर दिखाई गई संख्या शायद एक उदाहरण के लिए है, लेकिन यह 22 अंकों की लंबी है।


3
पुष्टि की, यह सिर्फ एक उदाहरण के लिए है। मैंने कीबोर्ड को मैश किया।
ब्रैंडन बर्टेल्सन

1

मुझे लगता है कि ऐसा कुछ होगा

library(tutoR)
format(1.128347132904321674821, 2)

प्रति थोड़ी ऑनलाइन मदद


मुझे यह मिला, लेकिन इसके लिए एक पैकेज की आवश्यकता है, मैं बेस पैकेज के भीतर कुछ ढूंढ रहा हूं।
ब्रैंडन बर्टेल्सन

2
@ब्रांड, प्रारूप () आधार का हिस्सा है। R और टाइप करें फॉर्मेट ... कोई भी पैकेज की जरूरत नहीं है।
जद लॉन्ग

ह्म्म्म, क्या आपने इस आउटपुट को देखा? [१] "1.128347" अन्यथा, आप इसके बारे में बिल्कुल सही हैं कि यह आधार पैकेज में है, मेरा बुरा।
ब्रैंडन बर्टेल्सन

1
शायद format.default(x, digits = 2)लिंक के आधार पर अंधेरे में सिर्फ एक शॉट का प्रयास करें । यह जानकारी कुछ है जो मैं सामान्य रूप से दस्तावेज़ीकरण के लिए पढ़ी जाने वाली चीज़ों की कमी है, मैं मुद्रित आउटपुट को भी देखने की उम्मीद करता हूं।
टिम मीर्स

बस ध्यान दिया जाता है कि आपका लिंक tutoR प्रलेखन की ओर इशारा करता है, जो आधार का हिस्सा नहीं है।
ब्रैंडन बर्टेल्सन

1

यदि आप किसी संख्या या सूची को गोल करना चाहते हैं, तो बस उपयोग करें

round(data, 2)

फिर, डेटा 2 दशमलव स्थान पर होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.