R: einfache Multiplikation verursacht Integer-Überlauf

8

In einem längeren Skript muss ich die Länge eines Vektors A (2614) mit der Anzahl der Zeilen eines Datenrahmens B (1456000) multiplizieren. Wenn ich das direkt mit length(A) * nrow(B) mache, bekomme ich die Nachricht NAs produced by integer overflow , obwohl es kein Problem gibt, wenn ich die gleichen Zahlen multipliziere:

%Vor%

Die einzige Möglichkeit, die Multiplikation zu aktivieren, ist round(length(A)) * nrow(B) oder length(A) * round(nrow(B)) . Aber die von length und nrow erzeugten Zahlen müssen sowieso ganze Zahlen sein! Außerdem habe ich das mit der folgenden Funktion getestet, die auf der Hilfeseite für die Funktion is.integer ...

vorgeschlagen wird %Vor%

... und natürlich sind sie ganze Zahlen. Also warum brauche ich die Krücken "rund" hier? Sehr rätselhaft ... Hat jemand eine Idee was im Hintergrund los ist?

    
user7417 15.07.2013, 09:24
quelle

1 Antwort

11

Hoffentlich eine grafische Darstellung dessen, was passiert ....

%Vor%

2614 * 1456000 ist ein numeric , weil beide Operanden tatsächlich der Klasse numeric angehören. Der Überlauf tritt auf, weil sowohl nrow als auch length integer zurückgeben und daher das Ergebnis eine ganze Zahl ist, aber das Ergebnis die maximale Größe überschreitet, die durch die Klasse integer dargestellt werden kann (+/- 2 * 10 ^ 9). A numeric oder double können 2e-308 to 2e+308 enthalten. Um Ihr Problem zu lösen, verwenden Sie einfach as.numeric(length(A)) oder as.double(length(A)) .

    
Simon O'Hanlon 15.07.2013, 09:29
quelle

Tags und Links