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


93

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

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

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

私の質問は、なぜこれが当てはまるのか、そして整数のセットのデフォルトクラスが数値クラスである理由、および整数の代わりに数値として整数を設定することの利点と欠点は何ですか?


4
as.integer(c(4.1, 5.2, 6.3, 6.4))ヘルプには、あなたは違いを理解しますか?内部表現と印刷される内容がまったく同じではないことを理解する必要があります。とにかく、コンピューター言語のデータ型について読んでください。
Roland

右側の「関連」の欄では、この質問です:stackoverflow.com/questions/8804779/...
マシュー・ランドバーグ

1
x <- 1; is.integer(x); is.numeric(x)では、x <- 1L; is.integer(x); is.numeric(x)を試してみてください。違いが少しわかるかもしれません。整数クラスは、C構造体から変数を渡すために使用され、R構造体でも使用されます。しかし、これにはまだまだたくさんあります。
Rich Scriven、2014年

@Roland精度を指定するクラスについては考えていませんでした。整数クラスを操作するためにfloatメソッドを使用することに慣れています。それは理にかなっている。
Keon

回答:


82

「数値」クラスとしてグループ化された複数のクラスがあり、そのうち2つは、倍精度(倍精度浮動小数点数の場合)と整数です。Rは必要に応じて数値クラス間で自動的に変換するため、現在のところ、数値3が整数として格納されているか、倍精度として格納されているかは、通常のユーザーには関係ありません。ほとんどの計算は倍精度を使用して行われるため、多くの場合これがデフォルトのストレージです。

整数の方が格納領域が少なくて済むため、ベクトルがdoubleに変換されないことがわかっている場合(ID値またはインデックスとして使用される)、ベクトルを整数として具体的に格納したい場合があります。しかし、それらをdoubleに変換する計算で使用する場合は、最初にdoubleとして保存するのがおそらく最も速いでしょう。


45

まず、何年もの間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


11
Quoraの投稿から正確に取ったものですよね?あなたはリファレンスに言及したかもしれません!
Srujan Barai


4

ヘルプページを引用するには(試してみてください?integer)、太字の部分が私のものです。

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

Rの現在の実装では整数ベクトルに32ビット整数を使用しているため、表現可能な整数の範囲は約+/- 2 * 10 ^ 9に制限されています。倍精度浮動小数点数は、はるかに大きな整数を正確に保持できます。

ヘルプページが言うように、Rの integerは32ビットの数値に署名されているため、-2147483648〜+2147483647を保持でき、最大4バイトを使用できます。

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

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

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

1

私の理解では、データ型の変数を宣言していないため、デフォルトでは、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:5整数を作成するような範囲に注意してください。
QWR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.