R में पूर्णांक वर्ग और संख्यात्मक वर्ग के बीच क्या अंतर है


96

मैं यह कहकर प्रस्तावना करना चाहता हूं कि मैं एक पूर्ण प्रोग्रामिंग शुरुआती हूं, इसलिए कृपया बहाना करें कि यह प्रश्न कितना बुनियादी है।

मैं आर में "परमाणु" कक्षाओं की बेहतर समझ प्राप्त करने की कोशिश कर रहा हूं और शायद यह सामान्य रूप से प्रोग्रामिंग में कक्षाओं के लिए जाता है। मैं एक वर्ण, तार्किक और जटिल डेटा वर्गों के बीच अंतर को समझता हूं, लेकिन मैं एक संख्यात्मक वर्ग और पूर्णांक वर्ग के बीच मूलभूत अंतर को खोजने के लिए संघर्ष कर रहा हूं।

मान लीजिए कि मेरे पास x <- c(4, 5, 6, 6)पूर्णांक का एक सरल वेक्टर है, तो यह पूर्णांक वर्ग होने के लिए समझ में आता है। लेकिन जब मुझे class(x)मिलता है [1] "numeric"। फिर अगर मैं इस वेक्टर को पूर्णांक वर्ग में बदल दूं x <- as.integer(x)। यह कक्षा को छोड़कर संख्याओं की समान सटीक सूची को लौटाता है।

मेरा सवाल यह है कि ऐसा क्यों है, और पूर्णांक के सेट के लिए डिफ़ॉल्ट वर्ग एक संख्यात्मक वर्ग क्यों है, और पूर्णांक के बजाय पूर्णांक के रूप में पूर्णांक सेट होने के क्या फायदे और नुकसान हैं।


4
क्या as.integer(c(4.1, 5.2, 6.3, 6.4))आपको अंतर समझने में मदद मिलती है? आपको यह समझने की आवश्यकता है कि आंतरिक प्रतिनिधित्व और जो छपा है, वह बिल्कुल समान नहीं है। वैसे भी, कंप्यूटर भाषाओं में डेटा प्रकारों के बारे में कुछ पढ़ना।
रोलैंड

दाईं ओर "संबंधित" कॉलम में यह प्रश्न है: stackoverflow.com/questions/8804779/…
मैथ्यू लुंडबर्ग

1
कोशिश करो x <- 1; is.integer(x); is.numeric(x), तो x <- 1L; is.integer(x); is.numeric(x)और आप अंतर को देखने में सक्षम हो सकते हैं। पूर्णांक वर्ग का उपयोग C कंस्ट्रक्शन से आर वेरिएबल्स में और वेरिएबल पास करने के लिए अधिक किया जाता है। हालाँकि, इसके लिए बहुत कुछ है।
रिच स्क्रिप्‍ट

@ रोलैंड मैं सटीक निर्दिष्ट करने वाली कक्षाओं के बारे में नहीं सोचता था। पूर्णांक कक्षाओं में हेरफेर करने के लिए मुझे फ्लोट विधियों का उपयोग करने के लिए उपयोग किया जाता है। यह समझ में आता है।
केयोन

जवाबों:


87

कई वर्ग हैं जिन्हें "संख्यात्मक" वर्गों के रूप में एक साथ वर्गीकृत किया गया है, जिनमें से 2 सबसे आम हैं (डबल सटीक फ़्लोटिंग पॉइंट संख्या के लिए) और पूर्णांक। आर स्वचालित रूप से जरूरत पड़ने पर संख्यात्मक कक्षाओं के बीच परिवर्तित हो जाएगा, इसलिए अधिकांश भाग के लिए यह आकस्मिक उपयोगकर्ता के लिए कोई फर्क नहीं पड़ता कि नंबर 3 वर्तमान में पूर्णांक के रूप में संग्रहीत है या दोहरे के रूप में। अधिकांश गणित दोहरी सटीकता का उपयोग करके किया जाता है, इसलिए यह अक्सर डिफ़ॉल्ट भंडारण होता है।

कभी-कभी आप विशेष रूप से एक वेक्टर को पूर्णांक के रूप में संग्रहीत करना चाहते हैं यदि आप जानते हैं कि वे कभी भी डबल्स में परिवर्तित नहीं होंगे (आईडी मान या अनुक्रमण के रूप में उपयोग किया जाता है) क्योंकि पूर्णांकों को कम संग्रहण स्थान की आवश्यकता होती है। लेकिन अगर वे किसी भी गणित में इस्तेमाल होने जा रहे हैं जो उन्हें डबल में बदल देगा, तो संभवत: यह सिर्फ उन्हें शुरू करने के लिए डबल्स के रूप में स्टोर करने के लिए सबसे तेज होगा।


47

सबसे पहले, यह आर वर्षों से सफलतापूर्वक उपयोग करने के लिए पूरी तरह से संभव है और इस प्रश्न का उत्तर जानने की आवश्यकता नहीं है। आर (सामान्य) संख्यात्मक और पूर्णांकों के बीच के अंतर को आपके लिए पृष्ठभूमि में संभालता है।

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(पूर्णांक के बाद पूँजी Put L ’लगाने पर यह पूर्णांक के रूप में संग्रहीत होने के लिए बाध्य करती है।)

जैसा कि आप देख सकते हैं "पूर्णांक" "संख्यात्मक" का एक सबसेट है।

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

इंटेगर केवल 2 बिलियन से थोड़ा अधिक जाते हैं, जबकि अन्य न्यूमेरिक्स बहुत बड़े हो सकते हैं। वे बड़े हो सकते हैं क्योंकि वे डबल सटीक फ़्लोटिंग पॉइंट संख्या के रूप में संग्रहीत होते हैं। इसका मतलब है कि संख्या दो टुकड़ों में संग्रहीत है: प्रतिपादक (जैसे कि 308 ऊपर, बेस 10 के बजाय बेस 2 में छोड़कर), और "महत्व" (जैसे 1.797693 ऊपर)।

ध्यान दें कि 'is.integer' इस बात का परीक्षण नहीं है कि आपके पास पूरी संख्या है, लेकिन डेटा कैसे संग्रहीत किया जाता है, इसकी एक परीक्षा।

देखने के लिए एक बात यह है कि कोलन ऑपरेटर, :पूर्णांक को लौटाएगा यदि स्टार्ट और एंड पॉइंट पूरे नंबर हैं। उदाहरण के लिए, 1 से 5 तक संख्याओं का 1:5एक integerवेक्टर बनाता है। आपको पत्र को संलग्न करने की आवश्यकता नहीं है L

> class(1:5)
[1] "integer"

संदर्भ: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
बिल्कुल Quora पोस्ट से लिया गया है? आप सिर्फ संदर्भ का उल्लेख कर सकते थे!
सर्जन बरई


4

सहायता पृष्ठ (कोशिश ?integer) को कोट करने के लिए , बोल्ड किए गए हिस्से की खान:

पूर्णांक वैक्टर मौजूद हैं ताकि डेटा को C या फोरट्रान कोड से पारित किया जा सके जो उन्हें उम्मीद करता है, और इसलिए (छोटे) पूर्णांक डेटा को बिल्कुल और कॉम्पैक्ट रूप से दर्शाया जा सकता है

ध्यान दें कि आर के वर्तमान कार्यान्वयन पूर्णांक वैक्टर के लिए 32-बिट पूर्णांक का उपयोग करते हैं, इसलिए प्रतिनिधित्व योग्य पूर्णांकों की सीमा लगभग +/- 2 * 10 ^ 9: तक सीमित होती है, युगल बहुत बड़े पूर्णांकों को पकड़ सकते हैं।

जैसे हेल्प पेज कहता है, आर के integer32-बिट नंबरों पर हस्ताक्षर किए गए हैं, इसलिए -2147483648 और +2147483647 के बीच पकड़ कर 4 बाइट ले सकते हैं।

R का IEEE 754 मानक के अनुरूप numeric64-बिट के समान है double। R का एक भी सटीक डेटा प्रकार नहीं है। (स्रोत: पृष्ठों की मदद numericऔर double)। एक डबल सटीक बिना खोए हुए -2 ^ 53 और 2 ^ 53 के बीच सभी पूर्णांकों को स्टोर कर सकता है।

हम वेक्टर ( स्रोत ) के ओवरहेड सहित डेटा प्रकार के आकार देख सकते हैं :

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes

1

मेरी समझ में - हम एक डेटा प्रकार के साथ एक चर घोषित नहीं करते हैं, इसलिए डिफ़ॉल्ट रूप से आर ने एल के बिना किसी भी संख्या को एक संख्यात्मक सेट किया है। अगर आपने लिखा है:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

पूर्णांक का उदाहरण:

> x<- 2L
> print(x)

न्यूमेरिक का उदाहरण (अन्य प्रोग्रामिंग भाषाओं से डबल / फ्लोट की तरह)

> x<-3.4
> print(x)

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