8

非常に長い整数を含む単一の列を持つcsvをインポートしています(例:2121020101132507598)

a <-read.csv('temp.csv'、as.is = T)

これらの整数を文字列としてインポートすると正しく処理されますが、整数としてインポートすると最後の数桁が変更されます。何が起こっているのかわかりません...

1 "4031320121153001444" 4031320121153001472
2 "4113020071082679601" 4113020071082679808
3 "4073020091116779570" 4073020091116779520
4 "2081720101128577687" 2081720101128577792
5 "4041720081087539887" 4041720081087539712
6 "4011120071074301496" 4011120071074301440
7 "4021520051054304372" 4021520051054304256
8 "4082520061068996911" 4082520061068997120
9 "4082620101129165548" 4082620101129165312

4

4 に答える 4

11

他の人が指摘しているように、これほど大きな整数を表すことはできません。ただし、Rはこれらの値を整数に読み取るのではなく、倍精度の数値に読み取るのです。

倍精度では、16桁までの数値しか正確に表すことができません。そのため、16桁の後に数値が丸められます。考えられる解決策については、 gmpRmpfr、およびint64パッケージを参照してください。それらのいずれにもファイルから読み取る関数はありませんが、それらのソースを調べることで何かを調理できるかもしれません。

更新:ファイルをint64オブジェクトに取り込む方法は次のとおりです。

# This assumes your numbers are the only column in the file
# Read them in however, just ensure they're read in as character
a <- scan("temp.csv", what="")
ia <- as.int64(a)
于 2012-07-11T21:02:06.650 に答える
7

Rの最大整数値は約2E9です。@Joshuaが別の回答で述べているように、考えられる解決策の1つはint64パッケージです。

代わりに、値を文字としてインポートします。次に、タイプint64に変換します。

require(int64)
a <- read.csv('temp.csv', colClasses = 'character', header=FALSE)[[1]]
a <- as.int64(a)
print(a)
[1] 4031320121153001444 4113020071082679601 4073020091116779570
[4] 2081720101128577687 4041720081087539887 4011120071074301496
[7] 4021520051054304372 4082520061068996911 4082620101129165548
于 2012-07-11T21:13:16.847 に答える
4

それほど大きな整数を表すことはできません。見る

.Machine

私の箱にはこれがあります

$integer.max
[1] 2147483647
于 2012-07-11T20:35:52.757 に答える
3

32ビットの符号付き整数の最大値は2,147,483,647です。あなたの数ははるかに大きいです。

代わりに、浮動小数点値としてインポートしてみてください。

Rまたはその他の言語で浮動小数点演算を処理する場合に注意すべきいくつかの注意事項があります。

http://blog.revolutionanalytics.com/2009/11/floatingpoint-errors-explained.html

http://blog.revolutionanalytics.com/2009/03/when-is-a-zero-not-a-zero.html

http://floating-point-gui.de/basic/

于 2012-07-11T20:37:35.253 に答える