Keo*_*eon 83 integer r class numeric object
我想说这是一个绝对的编程初学者,所以请原谅这个问题是多么基本.
我试图更好地理解R中的"原子"类,也许这适用于编程中的类.我理解字符,逻辑和复杂数据类之间的区别,但我很难找到数字类和整数类之间的根本区别.
假设我有一个简单x <- c(4, 5, 6, 6)的整数向量,这对于整数类是有意义的.但是,当我这样做class(x),我得到[1] "numeric".然后,如果我将此向量转换为整数类x <- as.integer(x).除了类不同之外,它返回相同的精确数字列表.
我的问题是为什么会出现这种情况,以及为什么一组整数的默认类是一个数字类,以及将整数设置为数字而不是整数的优点和缺点是什么.
Gre*_*now 72
有多个类组合在一起作为"数字"类,其中最常见的两个是double(对于双精度浮点数)和整数.R将在需要时自动在数字类之间进行转换,因此对于临时用户而言,数字3当前是以整数还是以双精度存储并不重要.大多数数学运算使用双精度,因此通常是默认存储.
有时您可能希望将向量专门存储为整数,如果您知道它们永远不会转换为双精度(用作ID值或索引),因为整数需要较少的存储空间.但是如果它们将被用于将它们转换为双倍的任何数学,那么将它们作为双打开始可能是最快的.
小智 37
首先,多年来成功使用R是完全可行的,不需要知道这个问题的答案.R在后台处理(通常)数字和整数之间的差异.
> is.numeric(1)
[1] TRUE
> is.integer(1)
[1] FALSE
> is.numeric(1L)
[1] TRUE
> is.integer(1L)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
(在整数后面加上大写'L'会强制它存储为整数.)
如您所见,"整数"是"数字"的子集.
> .Machine$integer.max
[1] 2147483647
> .Machine$double.xmax
[1] 1.797693e+308
Run Code Online (Sandbox Code Playgroud)
整数只有20多亿,而其他数字可能要大得多.它们可以更大,因为它们存储为双精度浮点数.这意味着该数字存储在两个部分中:指数(如上面的308,除了基数2而不是基数10),以及"有效数"(如上面的1.797693).
请注意,'is.integer'不是测试您是否拥有整数,而是测试数据的存储方式.
需要注意的一点是,:如果起点和终点是整数,冒号运算符将返回整数.例如,1:5创建一个integer从1到5的数字向量.您不需要附加该字母L.
> class(1:5)
[1] "integer"
Run Code Online (Sandbox Code Playgroud)
参考:https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R
要引用帮助页面(尝试?integer),我的粗体部分:
存在整数向量,以便数据可以传递给需要它们的 C 或 Fortran 代码,并且(小)整数数据可以精确而紧凑地表示。
请注意,R 的当前实现对整数向量使用 32 位整数,因此可表示整数的范围被限制在大约 +/-2*10^9:双精度数可以精确地容纳更大的整数。
就像帮助页面所说的那样,R 的integers 是有符号的 32 位数字,因此可以在 -2147483648 和 +2147483647 之间保持并占用 4 个字节。
Rnumeric与double符合 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
Run Code Online (Sandbox Code Playgroud)