R中的整数类和数字类有什么区别

时间:2014-05-14 16:21:07

标签: r class object integer numeric

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

我正在努力更好地理解R中的“原子”类,这可能适用于编程中的类。我理解字符,逻辑和复杂数据类之间的区别,但我很难找到数字类和整数类之间的根本区别。

假设我有一个简单的整数x <- c(4, 5, 6, 6)向量,这对于整数类是有意义的。但是当我class(x)时,我得到[1] "numeric"。然后,如果我将此向量转换为整数类x <- as.integer(x)。除了类不同之外,它返回相同的精确数字列表。

我的问题是为什么会出现这种情况,以及为什么一组整数的默认类是一个数字类,以及将整数设置为数字而不是整数的优点和缺点是什么。

4 个答案:

答案 0 :(得分:64)

有多个类组合在一起作为“数字”类,其中最常见的两个是double(对于双精度浮点数)和整数。 R将在需要时自动在数字类之间进行转换,因此对于临时用户而言,数字3当前是以整数还是以双精度存储并不重要。大多数数学运算使用双精度,因此通常是默认存储。

有时您可能希望将矢量专门存储为整数,如果您知道它们永远不会转换为双精度(用作ID值或索引),因为整数需要较少的存储空间。但是如果它们将被用于任何将它们转换为双倍的数学中,那么将它们作为双打开始可能是最快的。

答案 1 :(得分:36)

首先,多年来成功使用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会创建一个从1到5的integer数字向量。您无需附加字母L

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

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

答案 2 :(得分:2)

要引用帮助页面(尝试?integer),请使用粗体显示部分:

  

存在整数向量,以便可以将数据传递给期望它们的C或Fortran代码,从而可以(小)整数数据精确而紧凑地表示

     

请注意,R的当前实现将32位整数用于整数矢量,因此可表示整数的范围被限制为大约+/- 2 * 10 ^ 9:双精度数可以精确地容纳更大的整数。

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

R的numeric与符合IEEE 754标准的64位double相同。 R没有单一精度数据类型。 (来源:numericdouble的帮助页面)。 A double can store all integers between -2^53 and 2^53 exactly without losing precision.

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

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

答案 3 :(得分: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)