2016-06-21 5 views
0

データフレームが与えられているので、dcast.data.table関数を使用して、長さから幅までキャストしようとしています。library(data.table)。しかし、数式の左側に大きな数値を使用すると、いくつかの方法が結合します。以下はdcast.data.tableの大きな数値のエラー

例です。

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) 

は、これが唯一の2行、10000000007624 & 10000000007784が生成されます、すべてがちょうどそれらの2にまとめることになります。

reshape2::dcast機能を使用しているときにこのエラーは発生しません。この方法では正しい結果が得られます。

dcast.data.tableがこのエラーを生成する理由はありますか?

+0

これが開発バージョンでも発生するかどうかを確認してください。バグレポートを提出する場合。回避策として、 'A'を文字に強制することができます。 – Roland

+0

@Rolandの問題は開発版でも発生し、チケットを発行しました。私は 'data.table :: dcast()'が期待通りに動作することを発見しました。 – amwill04

+1

私はgithubであなたの問題でフィードバックを提供しました。自分自身で質問に答えてください。 – jangorecki

答えて

2

githubで問題が発生し、@jangoreckiさんが回答しました。この回答は、setNumericRoundingヘルプドキュメントにあります。

参加またはグループ化すると、data.tableはそのようなデータをapx 11 s.fに丸めます。これは多くの場合、数字の桁違いです。これは、有効数字から最後の2バイトを切り捨てることによって実現されます。

私の14桁の大きい数字は丸められて結合されています。

@jangoreckiは、これを避けるには、setNumericRounding(0)と設定することで回避できます。しかし、私は個人的に私の大きな数値を要因に再分類しました。これは私の特定のユースケースにはより意味をなさない。

さらに、この@jangoreckiは、大きな数値を扱うときにはbit64パッケージの使用を推奨しています。

元の投稿はgithubです。