web-dev-qa-db-ja.com

Rの整数クラスと数値クラスの違いは何ですか

私は絶対的なプログラミングの初心者だと言ってこれを序文にしたいので、この質問がどれほど基本的かを言い訳してください。

Rの「アトミック」クラスをよりよく理解しようとしていますが、これはプログラミング全般のクラスにも当てはまります。文字、論理、および複雑なデータクラスの違いを理解していますが、数値クラスと整数クラスの根本的な違いを見つけるのに苦労しています。

整数の単純なベクトルx <- c(4, 5, 6, 6)があるとします。これが整数クラスであるのは理にかなっています。しかし、class(x)を実行すると、[1] "numeric"を取得します。次に、このベクトルを整数クラスx <- as.integer(x)に変換すると。クラスが異なることを除いて、同じ正確な数字のリストを返します。

私の質問は、なぜそうなのか、整数セットのデフォルトクラスが数値クラスである理由、整数を整数ではなく数値として設定することの利点と欠点は何ですか?.

75
Keon

「数値」クラスとしてグループ化された複数のクラスがあり、その中で最も一般的な2つは、double(倍精度浮動小数点数用)と整数です。 Rは必要に応じて数値クラス間で自動的に変換されるため、ほとんどの場合、3が整数として格納されているか、倍精度浮動小数点数として格納されているかは問題ありません。ほとんどの計算は倍精度を使用して行われるため、多くの場合それがデフォルトのストレージです。

整数がより少ないストレージスペースを必要とするため、それらがdoubleに変換されないことがわかっている場合(ID値またはインデックス付けとして使用される)、ベクトルを整数として特に格納することができます。しかし、それらをdoubleに変換する数学で使用する場合は、最初にdoubleとして保存するのがおそらく最も速いでしょう。

67
Greg Snow

まず最初に、Rを何年も首尾よく使用することは完全に実行可能であり、この質問に対する答えを知る必要はありません。 Rは、バックグラウンドで(通常の)数値と整数の違いを処理します。

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(整数の後に大文字の「L」を置くと、強制的に整数として格納されます。)

ご覧のとおり、「整数」は「数値」のサブセットです。

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

整数はわずか20億を超えますが、他の数値はさらに大きくなる可能性があります。倍精度浮動小数点数として格納されるため、より大きくなる可能性があります。これは、数値が2つの部分に格納されることを意味します。指数(上記の308など、基数10ではなく基数2を除く)、および「仮数」(上記の1.797693など)。

「is.integer」は、整数があるかどうかのテストではなく、データがどのように格納されているかをテストすることに注意してください。

注意すべきことの1つは、開始点と終了点が整数の場合、コロン演算子:は整数を返すことです。たとえば、1:5は、1から5までの数字のintegerベクトルを作成します。Lの文字を追加する必要はありません。

> class(1:5)
[1] "integer"

参照: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R

36

私の理解では-データ型の変数を宣言しないので、デフォルトではRはLのない数値を数値に設定します。あなたが書いた場合:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

整数の例:

> x<- 2L
> print(x)

数値の例(他のプログラミング言語のdouble/floatのようなもの)

> x<-3.4
> print(x)
1
Farah Nazifa

ヘルプページを引用するには(?integerを試してください)、太字の部分が次のようになります。

整数ベクトルが存在するため、データを期待するCまたはFortranコードにデータを渡すことができ、(小さな)整数データを正確かつコンパクトに表現できます

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

ヘルプページにあるように、Rのintegersは32ビットの符号付き数値であるため、-2147483648〜+2147483647の間に収まり、4バイトを占有できます。

Rのnumericは、IEEE 754標準に準拠する64ビットdoubleと同じです。 Rには単精度データ型はありません。 (ソース:numericおよびdoubleのヘルプページ)。 doubleは、精度を失うことなく、-2 ^ 53から2 ^ 53までのすべての整数を正確に格納できます。

ベクトルのオーバーヘッドを含むデータ型のサイズを確認できます( source ):

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes
0
qwr