Wat is het verschil tussen integer-klasse en numerieke klasse in R

Ik wil dit voorafgaan door te zeggen dat ik een absolute beginner ben in programmeren, dus excuseer me hoe eenvoudig deze vraag is.

Ik probeer een beter begrip te krijgen van “atomaire” klassen in R en misschien geldt dit voor klassen in programmeren in het algemeen. Ik begrijp het verschil tussen een karakter, logische en complexe dataklassen, maar ik heb moeite om het fundamentele verschil te vinden tussen een numerieke klasse en een integer-klasse.

Stel dat ik een eenvoudige vector x <- c(4, 5, 6, 6)van gehele getallen heb, dan zou het logisch zijn dat dit een geheeltallige klasse is. Maar als ik class(x)doe, krijg ik [1] "numeric". Als ik deze vector vervolgens converteer naar een integer-klasse x <- as.integer(x). Het geeft dezelfde exacte lijst met getallen terug, behalve dat de klasse anders is.

Mijn vraag is waarom dit het geval is, en waarom de standaardklasse voor een reeks gehele getallen een numerieke klasse is, en wat zijn de voor- en/of nadelen van het hebben van een geheel getal dat is ingesteld als numeriek in plaats van als geheel getal.


Antwoord 1, autoriteit 100%

Er zijn meerdere klassen die zijn gegroepeerd als “numerieke” klassen, waarvan de twee meest voorkomende dubbel (voor dubbele precisie drijvende-kommagetallen) en integer zijn. R converteert automatisch tussen de numerieke klassen wanneer dat nodig is, dus voor het grootste deel maakt het voor de gewone gebruiker niet uit of het getal 3 momenteel is opgeslagen als een geheel getal of als een dubbel. De meeste wiskunde wordt gedaan met dubbele precisie, dus dat is vaak de standaardopslag.

Misschien wil je misschien een vector een vector opslaan als gehele getallen als je weet dat ze nooit worden omgezet in doubles (gebruikt als ID-waarden of indexering), aangezien integers minder opslagruimte nodig hebben. Maar als ze in elke wiskunde worden gebruikt die ze zal converteren naar het dubbele, zal het waarschijnlijk het snelst zijn om ze gewoon als doubles op te slaan om mee te beginnen.


Antwoord 2, Autoriteit 53%

Patrick Burns on Quora zegt :

Ten eerste, het is perfect haalbaar om al jaren met succes te gebruiken
en hoef niet het antwoord op deze vraag te kennen. R verwerkt de
verschillen tussen de (gebruikelijke) numeriek en gehele getallen voor u in de
achtergrond.

> is.numeric(1)
[1] TRUE
> is.integer(1)
[1] FALSE
> is.numeric(1L)
[1] TRUE
> is.integer(1L)
[1] TRUE

(Capital ‘L’ plaatsen Nadat een geheel getal het wordt opgeslagen als een
geheel getal.)

Zoals u kunt zien “Integer” is een subset van “numeriek”.

> .Machine$integer.max
[1] 2147483647
> .Machine$double.xmax
[1] 1.797693e+308

Integers gaan alleen maar iets meer dan 2 miljard, terwijl de ander
Numeriek kan veel groter zijn. Ze kunnen groter zijn omdat ze dat zijn
opgeslagen als dubbele precisie drijvende puntnummers. Dit betekent dat
Het nummer wordt opgeslagen in twee stukken: de exponent (zoals 308 hierboven,
behalve in basis 2 in plaats van basis 10), en de “significand” (zoals
1.797693 hierboven).

Merk op dat ‘is.integer’ geen test is van of je een geheel hebt
nummer, maar een test van hoe de gegevens worden opgeslagen.

Eén ding om op te letten, is dat de dubbele punt-operator, :, gehele getallen teruggeeft als het begin- en eindpunt hele getallen zijn. 1:5maakt bijvoorbeeld een integervector van getallen van 1 tot 5. U hoeft de letter Lniet toe te voegen.

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

Referentie: https:/ /www.quora.com/Wat-is-het-verschil-tussen-numerieke-en-integer-in-R


Antwoord 3, autoriteit 5%

Om de helppagina te citeren (probeer ?integer), vetgedrukt gedeelte van mij:

Er bestaan gehele vectoren zodat gegevens kunnen worden doorgegeven aan de C- of Fortran-code die ze verwacht, en zodat (kleine) gegevens met gehele getallen exact en compact kunnen worden weergegeven.

Houd er rekening mee dat de huidige implementaties van R 32-bits gehele getallen gebruiken voor gehele vectoren, dus het bereik van representeerbare gehele getallen is beperkt tot ongeveer +/-2*10^9: doubles kunnen exact veel grotere gehele getallen bevatten.

Zoals de helppagina zegt, zijn de integers van R’s 32-bits getallen met een teken en kunnen ze tussen -2147483648 en +2147483647 bevatten en 4 bytes in beslag nemen.

R’s numericis identiek aan een 64-bits doubledie voldoet aan de IEEE 754-standaard. R heeft geen enkel precisiegegevenstype. (bron: helppagina’s van numericen double). Een double kan alle gehele getallen tussen -2^53 en 2^ opslaan 53 precies zonder precisie te verliezen.

We kunnen de grootte van het gegevenstype zien, inclusief de overhead van een vector (bron):

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

Antwoord 4

Naar mijn begrip – we declareren geen variabele met een gegevenstype, dus standaard heeft R een willekeurig getal zonder L als een numeriek ingesteld.
Als je schreef:

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

Voorbeeld van geheel getal:

> x<- 2L
> print(x)

Voorbeeld van numeriek (een beetje zoals double/float van andere programmeertalen)

> x<-3.4
> print(x)

Other episodes