R中的整数类和数字类有啥区别
Posted
技术标签:
【中文标题】R中的整数类和数字类有啥区别【英文标题】:What's the difference between integer class and numeric class in RR中的整数类和数字类有什么区别 【发布时间】:2014-07-02 19:54:47 【问题描述】:我想先说我是一个绝对的编程初学者,所以请原谅这个问题有多基本。
我正试图更好地理解 R 中的“原子”类,也许这适用于一般的编程类。我了解字符、逻辑和复杂数据类之间的区别,但我很难找到数字类和整数类之间的根本区别。
假设我有一个简单的整数向量x <- c(4, 5, 6, 6)
,这将是一个整数类。但是当我做class(x)
时,我得到[1] "numeric"
。然后,如果我将此向量转换为整数类x <- as.integer(x)
。它返回相同的确切数字列表,除了类不同。
我的问题是为什么会这样,为什么一组整数的默认类是数字类,以及将整数设置为数字而不是整数的优点和缺点是什么。
【问题讨论】:
as.integer(c(4.1, 5.2, 6.3, 6.4))
是否有助于您了解其中的差异?您需要了解内部表示和打印的内容根本不一样。无论如何,请阅读计算机语言中的数据类型。
在右边的“相关”栏中是这个问题:***.com/questions/8804779/…
尝试x <- 1; is.integer(x); is.numeric(x)
,然后尝试x <- 1L; is.integer(x); is.numeric(x)
,您可能会看到一点不同。整数类更多地用于从 C 结构和 R 结构中传递变量。不过,这还有很多。
@Roland 我没有考虑指定精度的类。我习惯于使用浮点方法来操作整数类。这是有道理的。
【参考方案1】:
有多个类被组合为“数字”类,其中最常见的 2 个是双精度(用于双精度浮点数)和整数。 R 会在需要时自动在数字类之间进行转换,因此对于临时用户来说,大多数情况下数字 3 当前存储为整数还是双精度数都无关紧要。大多数数学都是使用双精度完成的,因此这通常是默认存储。
如果您知道向量永远不会转换为双精度值(用作 ID 值或索引),有时您可能希望将向量专门存储为整数,因为整数需要较少的存储空间。但是,如果要在任何将它们转换为双精度的数学中使用它们,那么一开始就将它们存储为双精度可能是最快的。
【讨论】:
【参考方案2】:Quora 上的 Patrick Burns says:
首先,多年来成功使用 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
【讨论】:
完全取自 Quora 帖子对吧?您可能只是提到了参考! quora.com/… 链接的 URL 位于顶部 - 两者都存储“数字”,整数类存储为整数,数字类可以有小数。感谢 Rana 发布 URL。我自己一直在想这个问题。 @SrujanBarai,一般来说,如果人们只是发布到其他地方的链接,就会被标记。重复答案或其本质被认为是有用的。如果链接到的信息消失了怎么办? @abalter 是的,但是在发布帖子的同时,您还应该发布参考。该帖子最初没有原始帖子的参考。【参考方案3】:据我了解 - 我们没有声明具有数据类型的变量,因此默认情况下 R 已将任何没有 L 的数字设置为数字。 如果你写:
> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct
整数示例:
> x<- 2L
> print(x)
数值示例(有点像其他编程语言中的双精度/浮点数)
> x<-3.4
> print(x)
【讨论】:
注意1:5
这样的范围会创建整数。【参考方案4】:
引用帮助页面(尝试?integer
),我的粗体部分:
整数向量的存在是为了将数据传递给需要它们的 C 或 Fortran 代码,从而(小)整数数据可以精确而紧凑地表示。
请注意,R 的当前实现使用 32 位整数作为整数向量,因此可表示整数的范围被限制在大约 +/-2*10^9 左右:双精度可以精确地容纳更大的整数。
就像帮助页面说的那样,R 的 integer
s 是有符号的 32 位数字,因此可以容纳在 -2147483648 和 +2147483647 之间并占用 4 个字节。
R 的 numeric
与符合 IEEE 754 标准的 64 位 double
相同。 R 没有单精度数据类型。 (来源:numeric
和 double
的帮助页面)。 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
【讨论】:
以上是关于R中的整数类和数字类有啥区别的主要内容,如果未能解决你的问题,请参考以下文章