2016-07-26 13 views
1

Ich verwende das data.table Paket für die Datenverarbeitung. Ich habe Probleme mit Gleichheit und Teilmenge festgestellt, wenn große Zahlen beteiligt sind. Ex:Große numerische Gleichheit und Teilmenge in data.table Paket

dt <- data.table(a = c(1, 841026176807, 841026176808)) 
dt[a==841026176807] 
      a 
1: 841026176807 
2: 841026176808 

Ich dachte, es Genauigkeitsverlust von numerischem Typ (Darstellung von Doppel/Gleitkommazahlen), aber dies funktioniert:

dt[dt$a==841026176807] 
      a 
1: 841026176807 

Warum ist das Verhalten nicht im Einklang? Ist das irgendwo dokumentiert oder Bug?

+0

'841026176807> .Maschine $ integer.max # [1] true', aber trotzdem denke ich, dass die erhöhte Präzision in R etwas neue Verwendung von 53bit ganzen Zahlen in gekickt haben sollte. Manchmal muss man Zeichenwerte für die Dateneingabe verwenden, aber dies sollte nicht für Konsolenoperationen benötigt werden. –

+0

Dies lag an der Standardrundung der letzten 2 Bytes für numerische Typen, um Gleitkomma-Ungenauigkeiten zu vermeiden, wie unter '? SetNumericRounding' dokumentiert. Dieses Verhalten wird jetzt wieder in normales Verhalten (d. H. Keine Rundung) in der [aktuellen Entwicklungsversion] (https://github.com/Rdatatable/data.table/wiki/Installation) wiederhergestellt. – Arun

Antwort

1

Die verschiedenen Vergleichsmethoden rufen verschiedene Funktionen unter der Haube auf und einige von ihnen können die Länge der ganzen Zahl nicht behandeln. Sie können dies überwinden mit interger64 von bit64, wie die gängige Praxis ist, wenn sie mit diesen langen ganzen Zahlen in R.

require(data.table) 
require(bit64) 
dt <- data.table(a = c(1, 841026176807, 841026176808)) 
dt$a <- as.integer64(dt$a) 
dt[a==841026176807] 
a 
1: 841026176807 
dt[dt$a==841026176807] 
a 
1: 841026176807 

Egal tun, wenn Sie verwenden data.table oder welche Operationen Sie ausführen, ist es am besten zu eit Sie verwendet intger64 oder um die Daten mit ganzen Zahlen dieser Länge zu rekodieren, um versehentliche Fehler zu vermeiden.

+0

Ich vermute, dass wir einen Betrogenen von http://stackoverflow.com/q/34285809/ betrachten, und das ist, was Sie mit Unterschieden unter der Haube meinen? Wie auch immer, ich habe gestern auf die neuste devel Version upgedatet und sehe das Verhalten des OPs nicht mehr, also kann ich es nicht wirklich herausfinden. – Frank

+1

@Frank, wir haben kürzlich die Rundung der 2-Byte-Funktion entfernt (da die Leute das Handbuch nicht zu lesen scheinen und 'integer64' verwenden, wie wir es vorschlagen .. Schau dir einfach die Nachrichten an .. – Arun

+0

@Frank I Ich meine, empirisch gesehen gibt es etwas anderes unter der Haube oder dieses Verhalten würde nicht als solches existieren. Ich weiß nicht, was es ist. Ich weiß nur, dass die Verwendung von "Ganzzahl64" die beste Methode für diese Art von Daten und Lösungen ist Das Problem –

3

aktuelle Implementierungen von R verwenden 32-Bit-Ganzzahlen für Integer-Vektoren, sodass der Bereich der wieder darstellbaren Ganzzahlen auf etwa +/- 2 * 10^9 beschränkt ist.

Wenn Sie Werte darüber speichern/lesen möchten, müssen Sie sie 64bit speichern.

Paket bit64 kann damit umgehen.

require(bit64) dt <- data.table(a = as.integer64(c(1, 841026176807, 841026176808)))

> dt[a==841026176807] 
       a 
1: 841026176807 
+0

Ich habe zwar den ersten Satz falsch gesetzt, aber bitte erziehe mich über die Kapazität von R und korrigiere die Fehlinformation .Machine $ integer.max repräsentiert nicht mehr die obere Grenze der "Ganzzahl-Genauigkeit", obwohl sie immer noch die Anzahl der maximalen Dimensionen für Vektoren und Matrizen begrenzt. –

+0

@ 42 Bitte beachten Sie den Hilfe-Abschnitt von '? Integer' in R. Die erste Zeile der von mir geschriebenen Lösung wird von dort bezogen. Yup ich muss in R erziehen, wie ich weiß, dass ich kein Experte bin. – PPC

+0

Ja. Das ist eine vernünftige Referenz für den Anfang. Es sagt auch: "Doubles können viel größere ganze Zahlen genau halten." Die Hilfeseiten sind nicht in einer Weise indiziert, die hier sehr hilfreich erscheint, obwohl ich denke, dass diese Information in ihnen an einem Punkt veröffentlicht wurde. Ich habe einen Artikel zitiert: http://StackOverflow.com/Questions/21140818/Long-Vector-not-supported-yet-error-in-r-windows-64bit-version/21142236#21142236 und aktualisiert eine frühere Antwort, wenn Version 3.0 machte die Änderung: http://stackoverflow.com/questions/8804779/what-istinteg-overflow-in-r-and-how-can-it-happen/8804991#8804991 –

Verwandte Themen