it-swarm.com.de

Was ist der Unterschied zwischen Ganzzahl- und Zahlenklasse in R?

Ich möchte dem vorausgehen, dass ich ein absoluter Anfänger bin, also entschuldigen Sie bitte, wie grundlegend diese Frage ist. 

Ich versuche, "atomare" Klassen in R besser zu verstehen und vielleicht gilt dies auch für Klassen in der Programmierung im Allgemeinen. Ich verstehe den Unterschied zwischen einer Zeichen-, einer logischen und einer komplexen Datenklasse, aber ich bemühe mich, den grundlegenden Unterschied zwischen einer numerischen Klasse und einer Ganzzahlklasse zu finden. 

Nehmen wir an, ich habe einen einfachen Vektor x <- c(4, 5, 6, 6) von Ganzzahlen. Es wäre sinnvoll, wenn dies eine Ganzzahlklasse ist. Aber wenn ich class(x) mache, bekomme ich [1] "numeric". Wenn ich dann diesen Vektor in eine Ganzzahlenklasse x <- as.integer(x) konvertiere. Es gibt dieselbe genaue Liste von Zahlen zurück, es sei denn, die Klasse unterscheidet sich. 

Meine Frage ist, warum dies der Fall ist und warum die Standardklasse für eine Menge von Ganzzahlen eine numerische Klasse ist. Welche Vor- und Nachteile hat es, wenn eine Ganzzahl als Ganzzahl statt als Ganzzahl festgelegt wird. 

64
Keon

Es gibt mehrere Klassen, die als "numerische" Klassen gruppiert werden, von denen die zwei am häufigsten doppelt sind (für Gleitkommazahlen mit doppelter Genauigkeit) und Ganzzahl. R konvertiert bei Bedarf automatisch zwischen den numerischen Klassen. Daher spielt es für den gelegentlichen Benutzer meist keine Rolle, ob die Zahl 3 derzeit als Ganzzahl oder als Doppelwert gespeichert ist. Die meisten Berechnungen werden mit doppelter Genauigkeit durchgeführt, so dass dies häufig der Standardspeicher ist. 

Manchmal möchten Sie möglicherweise einen Vektor speziell als Ganzzahlen speichern, wenn Sie wissen, dass sie niemals in Doubles (als ID-Werte oder Indizierung verwendet) konvertiert werden, da Ganzzahlen weniger Speicherplatz benötigen. Aber wenn sie in irgendeiner Mathematik verwendet werden, die sie in double umwandeln wird, dann wird es wahrscheinlich am schnellsten sein, sie einfach als Double zu speichern.

60
Greg Snow

Zunächst einmal ist es durchaus möglich, R über Jahre erfolgreich einzusetzen und die Antwort auf diese Frage nicht zu kennen. R behandelt die Unterschiede zwischen den (üblichen) Zahlen und Ganzzahlen für Sie im Hintergrund.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Das Einfügen von 'L' nach einer Ganzzahl zwingt die Speicherung als Ganzzahl.)

Wie Sie sehen können, ist "Ganzzahl" eine Teilmenge von "Numerisch".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Ganze Zahlen erreichen nur etwas mehr als 2 Milliarden, während die anderen Zahlen viel größer sein können. Sie können größer sein, da sie als Gleitkommazahlen mit doppelter Genauigkeit gespeichert werden. Dies bedeutet, dass die Zahl in zwei Teilen gespeichert ist: der Exponent (wie oben 308, außer in Basis 2 anstelle von Basis 10) und der "signifikante" (wie oben 1.797693).

Beachten Sie, dass 'is.integer' kein Test ist, ob Sie eine ganze Zahl haben, sondern wie die Daten gespeichert werden.

Es ist zu beachten, dass der Doppelpunktoperator : Ganzzahlen zurückgibt, wenn der Start- und Endpunkt ganze Zahlen sind. Beispiel: 1:5 erstellt einen integer-Vektor mit Zahlen von 1 bis 5. Sie müssen den Buchstaben L nicht anhängen.

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

Referenz: https://www.quora.com/Was-ist-differenzzwischen-numerisch-und-integer-in-R

33

Nach meinem Verständnis - wir deklarieren keine Variablen mit einem Datentyp, daher hat R standardmäßig eine Zahl ohne L als numerisch festgelegt.

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

Beispiel für eine ganze Zahl: 

> x<- 2L
> print(x)

Beispiel für eine Zahl (ähnlich wie double/float aus anderen Programmiersprachen)

> x<-3.4
> print(x)
0
Farah Nazifa

Um die Hilfeseite zu zitieren (versuchen Sie es mit ?integer), meinen fettgedruckten Teil:

Integer-Vektoren existieren, damit Daten an C- oder Fortran-Code übergeben werden können, der sie erwartet, und damit (kleine) Integer-Daten genau und kompakt dargestellt werden können .

Beachten Sie, dass die aktuellen Implementierungen von R 32-Bit-Ganzzahlen für Ganzzahlvektoren verwenden, sodass der Bereich der darstellbaren Ganzzahlen auf etwa +/- 2 × 10 ^ 9 beschränkt ist: Doubles können genau viel größere Ganzzahlen enthalten.

Wie auf der Hilfeseite angegeben, sind Rs integers 32-Bit-Zahlen mit Vorzeichen. Sie können also zwischen -2147483648 und +2147483647 gespeichert werden und 4 Bytes belegen.

Rs numeric ist identisch mit einem 64-Bit double, das dem IEEE 754-Standard entspricht. R hat keinen Datentyp mit einfacher Genauigkeit. (Quelle: Hilfeseiten von numeric und double). Ein Double kann alle ganzen Zahlen zwischen -2 ^ 53 und 2 ^ 53 exakt speichern, ohne an Genauigkeit zu verlieren.

Wir können die Datentypgrößen einschließlich des Overheads eines Vektors sehen ( source ):

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