2016-09-09 1 views
2

data.table注文その上に設定キー:それは正しくベースsort機能の受注、対照的にdata.tableのキーを設定すると、sort()と異なる順序が生成されますか?通常

> foo <- data.table(x = c(1234567890.02, 1234567890.01)) 
> setkey(foo, x) 
> foo - 1234567890 
      x 
1: 0.01999998 
2: 0.00999999 

:この場合

> foo <- data.table(x = c(8,6,7,5,3,0,9)) 
> setkey(foo, x) 
> foo 
    x 
1: 0 
2: 3 
3: 5 
4: 6 
5: 7 
6: 8 
7: 9 

でもないが

> sort(foo$x) - 1234567890 
[1] 0.00999999 0.01999998 

data.tableのソートアルゴリズムを適用すると、精度がいくらか失われているようですが、なぜですか?

+1

'v1.9.7'ではうまくいきました。 'library(bit64)'を読み込めますか? – akrun

+7

'?setNumericRounding'を参照して0に設定するか、v1.9.7がデフォルトを0に変更しました。(' bit64'とは関係ありません)。 –

+2

ああ、はい、私はv1.9.6を使用していました。 'setNumericRounding(0)'を呼び出した後は、必要に応じてそれらを順序付けします。ありがとう! :) –

答えて

0

マットDowleは、基本的には、彼のコメントでこれに答えますが、合計する:

v1.9.6data.tableでは、数値列を発注先に、デフォルトの動作が参加/グループ化/仮オフ最後の2つのバイトを丸めることでした。この動作は、setNumericRoundingを呼び出して変更できます。

このデフォルトのための正当化はスピードのためではなかったが、むしろのような驚くべき結果を避けるために:

DT = data.table(a=seq(0,1,by=0.2),b=1:2, key="a") 
DT 
setNumericRounding(0) # turn off rounding 
DT[.(0.4)] # works 
DT[.(0.6)] # no match, confusing since 0.6 is clearly there in DT 

を(。?setNumericRounding文書から取られた例link

しかし、このデフォルトの動作は、生成私がこの質問で与えたようなケースでは予期せぬ注文がありました。また

hereは、このような問題に対処するにはを参照してください、デフォルトでは(この投稿の時点でgithubに現在開発中)v1.9.7setNumericRounding(0)に変更されます。

関連する問題