在 R 中整数类和数值类的区别是什么

首先我想说,我是一个绝对的编程初学者,所以请原谅这个问题有多基本。

我试图更好地理解 R 中的“原子”类,也许这适用于一般的编程类。我理解字符类、逻辑类和复杂数据类之间的区别,但我很难找到数值类和整数类之间的根本区别。

假设我有一个简单的整数向量 x <- c(4, 5, 6, 6),它应该是一个整数类。但是当我做 class(x)时,我得到 [1] "numeric"。如果我把这个向量转换成一个整数类 x <- as.integer(x)。除了类不同之外,它返回相同的数字列表。

我的问题是为什么会这样,为什么整数集的默认类是数值类,以及将整数集作为数值而不是整数有哪些优点和缺点。

197256 次浏览

有多个类被分组为“数字”类,其中2个最常见的类是 double (用于双精度浮点数)和 int。当需要时,R 会自动在数字类之间转换,所以对于普通用户来说,数字3当前是以整数还是双精度数存储并不重要。大多数数学都是使用双精度进行的,因此这通常是默认存储。

Sometimes you may want to specifically store a vector as integers if you know that they will never be converted to doubles (used as ID values or indexing) since integers require less storage space. But if they are going to be used in any math that will convert them to double, then it will probably be quickest to just store them as doubles to begin with.

帕特里克 · 伯恩斯(Patrick Burns)在 Quora :

首先,多年成功地使用 R 是完全可行的 并且不需要知道这个问题的答案 中的(通常)数字和整数之间的差异 背景。

> is.numeric(1)


[1] TRUE


> is.integer(1)


[1] FALSE


> is.numeric(1L)


[1] TRUE


> is.integer(1L)


[1] TRUE

(将大写字母‘ L’放在整数后面会强制将其存储为 整数)

As you can see "integer" is a subset of "numeric".

> .Machine$integer.max


[1] 2147483647


> .Machine$double.xmax


[1] 1.797693e+308

Integers only go to a little more than 2 billion, while the other 数字可以大得多。他们可以更大,因为他们是 存储为双精度浮点数。这意味着 该数字存储在两个部分: 指数(如上面的308, except in base 2 rather than base 10), and the "significand" (like 1.797693).

注意,‘ is.int’不是一个测试是否有整数的测试 而是测试数据是如何存储的。

需要注意的一点是,如果开始点和结束点是整数,冒号运算符 :将返回整数。例如,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

根据我的理解,我们不用数据类型声明变量,所以默认情况下,R 将任何没有 L 的数字设置为数值。 如果你写道:

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

整数示例:

> x<- 2L
> print(x)

Numeric 示例(类似于其他编程语言的 double/float)

> x<-3.4
> print(x)

引用帮助页面(尝试 ?integer) ,粗体部分:

整数向量的存在使得数据可以传递给 C 或者 Fortran 代码,这些代码需要它们,因此 (小)整数数据可以精确和紧凑地表示

注意,当前 R 的实现使用32位整数作为整数向量,因此可表示整数的范围被限制在大约 +/-2 * 10 ^ 9: 双精度数可以精确地包含更大的整数。

正如帮助页面所说,R 的 integer是有符号的32位数字,因此可以保存在 -2147483648和 + 2147483647之间,占用4个字节。

R 的 numeric与符合 IEEE754标准的64位 double相同。R 没有单精度数据类型。(资料来源: numericdouble的帮助页)。双精度数可以精确地存储 -2 ^ 53和2 ^ 53之间的所有整数,而不会损失精度。

我们可以看到数据类型的大小,包括向量的开销(来源) :

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

Numeric 是几种类型的总括术语(例如 double 和 int)。整数是没有小数点的数字,因此在内存中以最小的空间存储。只有在使用此类数字进行计算时才使用整数类,否则将恢复为数值。