Was ist der Unterschied zwischen einer ganzzahligen Klasse und einer numerischen Klasse in R.

92

Ich möchte dies vorwegnehmen, indem ich sage, dass ich ein absoluter Programmieranfänger bin. Entschuldigen Sie bitte, wie grundlegend diese Frage ist.

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

Angenommen, ich habe einen einfachen Vektor x <- c(4, 5, 6, 6)von Ganzzahlen. Es wäre sinnvoll, wenn dies eine Ganzzahlklasse wäre. Aber wenn ich es tue, class(x)bekomme ich [1] "numeric". Dann, wenn ich diesen Vektor in eine Ganzzahlklasse konvertiere x <- as.integer(x). Es wird dieselbe exakte Liste von Zahlen zurückgegeben, außer dass die Klasse unterschiedlich ist.

Meine Frage ist, warum dies der Fall ist und warum die Standardklasse für einen Satz von Ganzzahlen eine numerische Klasse ist und welche Vor- und Nachteile es hat, wenn eine Ganzzahl anstelle einer Ganzzahl als numerisch festgelegt wird.

Keon
quelle
4
Hilft as.integer(c(4.1, 5.2, 6.3, 6.4))Ihnen, den Unterschied zu verstehen? Sie müssen verstehen, dass die interne Darstellung und das, was gedruckt wird, überhaupt nicht identisch sind. Lesen Sie auf jeden Fall etwas über Datentypen in Computersprachen.
Roland
In der Spalte "Verwandte" rechts ist diese Frage: stackoverflow.com/questions/8804779/…
Matthew Lundberg
1
Versuchen Sie es x <- 1; is.integer(x); is.numeric(x)dann x <- 1L; is.integer(x); is.numeric(x)und Sie können möglicherweise einen kleinen Unterschied erkennen. Ganzzahlige Klassen werden eher zum Übergeben von Variablen aus C-Konstrukten und auch in R-Strukturen verwendet. Es gibt jedoch noch viel mehr.
Rich Scriven
@ Roland Ich habe nicht über Klassen nachgedacht, die Präzision spezifizieren. Ich bin es gewohnt, float-Methoden zu verwenden, um ganzzahlige Klassen zu manipulieren. Es ergibt Sinn.
Keon

Antworten:

82

Es gibt mehrere Klassen, die als "numerische" Klassen zusammengefasst sind. Die beiden häufigsten sind double (für Gleitkommazahlen mit doppelter Genauigkeit) und integer. R konvertiert bei Bedarf automatisch zwischen den numerischen Klassen, sodass es für den Gelegenheitsbenutzer größtenteils nicht wichtig ist, ob die Zahl 3 derzeit als Ganzzahl oder als Doppelspeicher gespeichert ist. Die meisten Berechnungen werden mit doppelter Genauigkeit durchgeführt, daher ist dies häufig der Standardspeicher.

Manchmal möchten Sie einen Vektor möglicherweise speziell als Ganzzahlen speichern, wenn Sie wissen, dass sie niemals in Doppelte konvertiert werden (als ID-Werte oder Indizierung verwendet), da Ganzzahlen weniger Speicherplatz benötigen. Wenn sie jedoch in einer Mathematik verwendet werden, die sie in Double umwandelt, ist es wahrscheinlich am schnellsten, sie zunächst nur als Double zu speichern.

Greg Snow
quelle
45

Zunächst einmal ist es durchaus möglich, R jahrelang erfolgreich einzusetzen und die Antwort auf diese Frage nicht zu kennen. R behandelt die Unterschiede zwischen den (üblichen) Zahlen und ganzen Zahlen 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

(Wenn Sie das Großbuchstaben 'L' nach einer Ganzzahl setzen, wird es als Ganzzahl gespeichert.)

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

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Ganzzahlen gehen nur auf 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: dem Exponenten (wie 308 oben, außer in Basis 2 anstelle von Basis 10) und dem "Signifikanten" (wie 1,797693 oben).

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

Eine Sache, auf die Sie achten müssen, ist, dass der Doppelpunktoperator :Ganzzahlen zurückgibt, wenn der Start- und der Endpunkt ganze Zahlen sind. Erstellt beispielsweise 1:5einen integerVektor mit Zahlen von 1 bis 5. Sie müssen den Buchstaben nicht anhängen L.

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

Referenz: https://www.quora.com/Was-ist-differenz- zwischen- numerischer- und -zahl-in-R

Rana Muhammad Kashif
quelle
11
Genau aus dem Quora-Beitrag entnommen Richtig? Sie hätten gerade die Referenz erwähnen können!
Srujan Barai
4
quora.com/…
Srujan Barai
4

Um die ?integerHilfeseite zu zitieren (versuchen Sie es ), fettgedruckter Teil meiner:

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

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

Wie auf der integerHilfeseite angegeben, sind Rs 32-Bit-Nummern mit Vorzeichen, können also zwischen -2147483648 und +2147483647 liegen und 4 Byte belegen.

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

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

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

Nach meinem Verständnis deklarieren wir keine Variable mit einem Datentyp, daher hat R standardmäßig eine Zahl ohne L als Zahl festgelegt. Wenn Sie geschrieben haben:

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

Beispiel für eine Ganzzahl:

> x<- 2L
> print(x)

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

> x<-3.4
> print(x)
Farah Nazifa
quelle
Achten Sie auf einen Bereich 1:5, der Ganzzahlen erzeugt.
qwr