【问题标题】: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)) 是否有助于您了解其中的差异?您需要了解内部表示和打印的内容根本不一样。无论如何,请阅读计算机语言中的数据类型。
  • 在右边的“相关”栏中是这个问题:stackoverflow.com/questions/8804779/…
  • 尝试x <- 1; is.integer(x); is.numeric(x),然后尝试x <- 1L; is.integer(x); is.numeric(x),您可能会看到一点不同。整数类更多地用于从 C 结构和 R 结构中传递变量。不过,这还有很多。
  • @Roland 我没有考虑指定精度的类。我习惯于使用浮点方法来操作整数类。这是有道理的。

标签: r class object integer numeric


【解决方案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 帖子对吧?您可能只是提到了参考!
    • 链接的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2012-08-11
      • 1970-01-01
      • 2016-01-23
      相关资源
      最近更新 更多