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 的 integers 是有符号的 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

【讨论】:

以上是关于R中的整数类和数字类有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Java中的整数和int有啥区别?

Python 中的 !r 和 %r 有啥区别?

R中的()和[]有啥区别[关闭]

Java中的字符文字'\n'和'\r'有啥区别?

fopen中的r和rb有啥区别

R中的向量和列表数据类型有啥区别?