2016-06-21 3 views
0

Gegeben ein Datenrahmen Ich versuche, von Long-to-Wide mit der dcast.data.table Funktion von library(data.table) zu werfen. Wenn Sie jedoch große numerische Werte auf der linken Seite der Formel verwenden, werden einige kombiniert.Fehler mit großen Zahlen in dcast.data.table

Unten ist ein Beispiel:

df <- structure(list(A = c(10000000007624, 10000000007619, 10000000007745, 
10000000007624, 10000000007767, 10000000007729, 10000000007705, 
10000000007711, 10000000007784, 10000000007745, 10000000007624, 
10000000007762, 10000000007762, 10000000007631, 10000000007762, 
10000000007619, 10000000007628, 10000000007705, 10000000007762, 
10000000007624, 10000000007745, 10000000007706, 10000000007767, 
10000000007777, 10000000007624, 10000000007745, 10000000007624, 
10000000007777, 10000000007771, 10000000007631, 10000000007624, 
10000000007640, 10000000007642, 10000000007708, 10000000007711, 
10000000007745, 10000000007767, 10000000007655, 10000000007722, 
10000000007745, 10000000007762, 10000000007771, 10000000007617 
), B = c(4060697L, 7683673L, 7699192L, 1322422L, 7754939L, 7448486L, 
2188027L, 1061376L, 2095950L, 7793530L, 2095950L, 6447861L, 2188027L, 
7448451L, 7428427L, 7516354L, 7067801L, 2095950L, 6740142L, 405911L, 
4057215L, 1061345L, 7754945L, 7501748L, 2188027L, 7780980L, 6651988L, 
6649330L, 6655118L, 6556367L, 6463510L, 2347462L, 7675114L, 6556361L, 
1061345L, 7224099L, 6463515L, 2188027L, 6463515L, 7311234L, 7764971L, 
7224099L, 2347479L), C = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 
3L, 3L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 25L, 2L, 1L, 2L, 
1L, 1L, 1L)), .Names = c("A", "B", "C"), row.names = c(NA, -43L 
), class = "data.frame") 

df <- as.data.table(df) 

output <- dcast.data.table(df, A ~ B, value.var = "C", 
          fun.aggregate = sum, fill = NA) 

Dies wird nur 2 Reihen erzeugen, 10000000007624 & 10000000007784 und alles wird in nur diesen beiden zusammengefaßt werden.

Dieser Fehler tritt nicht auf, wenn die Funktion reshape2::dcast verwendet wird, diese Methode liefert das korrekte Ergebnis.

Gibt es einen Grund, warum dcast.data.table diesen Fehler produziert?

+0

Überprüfen Sie, ob dies auch mit der Entwicklungsversion geschieht. Wenn es einen Fehlerbericht eingibt. Als Workaround können Sie 'A' zum Zeichen zwingen. – Roland

+0

@Roland-Problem tritt auch bei der Entwicklungsversion auf und hat ein Ticket ausgelöst. Ich habe festgestellt, dass 'data.table :: dcast()' funktioniert jedoch wie erwartet. – amwill04

+1

Ich habe in Ihrer Ausgabe auf github Feedback gegeben, bitte zögern Sie nicht, die Frage selbst zu beantworten. – jangorecki

Antwort

2

Problem wurde auf GitHub ausgelöst und reagierte von @Jangorecki und diese Antwort stammt aus der setNumericRounding Hilfe Dokument.

Beim Verknüpfen oder Gruppieren rundet data.table solche Daten auf apx 11 s.f. Das sind viele Ziffern für viele Fälle. Dies wird erreicht, indem die letzten 2 Bytes vom Signifikanden abgerundet werden.

Als solche meine 14-stellige große numerische wo gerundet und daher kombiniert.

Wie @jangorecki erwähnt, kann dies durch Einstellung setNumericRounding(0) vermieden werden. Jedoch habe ich persönlich meine großen Zahlen zu Faktoren neu klassifiziert. Dies macht mehr Sinn für meinen speziellen Anwendungsfall.

Weiterhin empfiehlt @jangorecki auch die Verwendung des bit64 Pakets, wenn es sich um große numerische Daten handelt.

Der ursprüngliche Beitrag auf github.

Verwandte Themen