2016-07-26 5 views
1

データ処理用にdata.tableパッケージを使用しています。大きな数字が関わっている場合、私は平等とサブセットの問題に気付きました。例:data.tableパッケージの大きな数値型の等価性とサブセット

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

私はそれが数値型(ダブル/浮動小数点数の表現)から精度の損失だと思ったが、これは動作します:

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

なぜ行動が一貫していないのですか?これはどこかのバグかバグですか?

+0

'841026176807> .Machine $ integer.max#[1] true'のが、これにもかかわらず、私は53bit整数のRのやや新たな用途で利用可能な増加精度がで蹴られているべきだと思います。場合によっては、データ入力に文字値を使用する必要がありますが、これはコンソール操作には必要ありません。 –

+0

これは、 '?setNumericRounding'で文書化されている浮動小数点の不正確さを避けるために、数値型の最後の2バイトのデフォルトの丸めによるものです。この動作は、[現在のdevelバージョン](https://github.com/Rdatatable/data.table/wiki/Installation)の通常の動作(つまり、丸めなし)に戻ります。 – Arun

答えて

1

異なる比較方法では、フードの下で異なる機能が呼び出され、そのうちのいくつかは整数の長さを処理できません。 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 
a 
1: 841026176807 

dt[dt$a==841026176807] 
にかかわらず場合のあるとしてあなたは、 bit64から interger64でこれを克服することができますあなたは data.tableを使用していますか、実行している操作は、彼女の使用 intger64または不注意なエラーを避けるために、この長さの整数でデータを再コード化する。

+0

私は、私たちがhttp://stackoverflow.com/q/34285809/の一束を見ていると思っています。とにかく、私は昨日最新のdevelバージョンに更新して、今OPの動作を見ていないので、本当に自分自身を理解することはできません。 – Frank

+1

@Frank、私たちは最近、2バイト機能の丸めを削除しました(人はマニュアルを読んで、私たちが提案したように 'integer64'を使用しているように見えます)。 – Arun

+0

@Frank I経験的に言えば、フードの下で何か違うものがあるとか、このような振る舞いが存在しないということです。私はそれが何であるかを告白することはしません。 "integer64"を使うことがこのタイプのデータのベストプラクティスであり、 –

3

現在の実装では、整数ベクトルに対して32ビットの整数を使用するため、再提示可能な整数の範囲は約+/- 2 * 10^9に制限されます。

上記の値を保存/読み込みたい場合は、64ビットを保存する必要があります。

パッケージbit64がこれを処理できます。

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

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

私はupvotedしかし、最初の文はfalseです。Rの容量について教えて、誤情報を修正してください.Machine $整数。maxはベクトルや行列の最大次元の数を制限しますが、 "整数精度"の上限を表しません。 –

+0

@ 42 Rの '?integer'のヘルプセクションを参照してください。私の解答の1行目がそこから参照されます。うん、私は専門家ではないことを知っているので、私はRで教育する必要があるかもしれません。 – PPC

+0

はい。それはまずは​​妥当な参考資料です。また、「ダブルスはもっと大きな整数を正確に保持できる」とも述べている。ヘルプページは、この情報が一度に公開されたとは思いますが、ここでは非常に役立つように索引付けされていません。私はニュースアイテムを引用しました:http://stackoverflow.com/questions/21140818/long-vector-not-supported-yet-error-in-r-windows-64bit-version/21142236#21142236 3.0は変更を加えました:http://stackoverflow.com/questions/8804779/what-is-integer-overflow-in-r-and-how-can-it-happen/8804991#8804991 –