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))有助于您理解差异?您需要了解内部表示形式和打印内容完全不同。无论如何,请阅读有关计算机语言中的数据类型的内容。
罗兰

在“相关”一栏右边的是这样一个问题: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

@Roland我没有考虑过指定精度的类。我习惯于使用float方法来操作整数类。这说得通。
基恩(Keon)

Answers:


82

有多个类被分组为“数字”类,其中最常见的两个是双精度(对于双精度浮点数)和整数。R会在需要时自动在数字类之间转换,因此在大多数情况下,临时用户当前是否将数字3存储为整数还是双精度并不重要。大多数数学都是使用双精度完成的,因此通常是默认存储。

有时,如果您知道向量永远不会转换为双精度数(用作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亿,而其他数字可能会更大。它们可以更大,因为它们存储为双精度浮点数。这意味着数字存储为两部分:指数(类似于上面的308,但以2为底而不是以10为底)和“有效位数”(例如上面的1.797693)。

请注意,“ is.integer”不是测试您是否有整数,而是测试数据的存储方式。

要注意的一件事是,:如果起点和终点是整数,则冒号运算符将会返回整数。例如,1:5创建一个integer从1到5的数字向量。您无需附加字母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没有单一精度数据类型。(来源:帮助页面numericdouble)。双精度可以完全存储-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.